SpringBoot中MongoDB注解概念及使用


spring-data-mongodb主要有以下注解

@Id

主鍵,不可重復,自帶索引,可以在定義的列名上標注,需要自己生成並維護不重復的約束。如果自己不設置@Id主鍵,mongo會自動生成一個唯一主鍵,並且插入時效率遠高於自己設置主鍵。原因可參考上一篇mongo和mysql的性能對比。 
在實際業務中不建議自己設置主鍵,應交給mongo自己生成,自己可以設置一個業務id,如int型字段,用自己設置的業務id來維護相關聯的表。

@Document

標注在實體類上,類似於hibernate的entity注解,標明由mongo來維護該表。

 

@Indexed

聲明該字段需要加索引,加索引后以該字段為條件檢索將大大提高速度。 
唯一索引的話是@Indexed(unique = true)。 
也可以對數組進行索引,如果被索引的列是數組時,MongoDB會索引這個數組中的每一個元素。 
也可以對整個Document進行索引,排序是預定義的按插入BSON數據的先后升序排列。 
也可以對關聯的對象的字段進行索引,譬如User對關聯的address.city進行索引。

 

@CompoundIndex

復合索引,加復合索引后通過復合索引字段查詢將大大提高速度。

寫法如上,lastName和age將作為復合索引,數字參數指定索引的方向,1為正序,-1為倒序。方向對單鍵索引和隨機存不要緊,但如果你要執行分組和排序操作的時候,它就非常重要了。

 

@Field

代表一個字段,可以不加,不加的話默認以參數名為列名。

@Transient

被該注解標注的,將不會被錄入到數據庫中。只作為普通的javaBean屬性。

 

@DBRef

關聯另一個document對象。類似於mysql的表關聯,但並不一樣,mongo不會做級聯的操作。 
先來看一下不加DBRef時,mongo保存數據的情況: 
Article類有String title,List pictureList,兩個屬性,Picture有一個url,一個desc屬性。新建數個Picture對象,並賦值給Article的list,執行Article的insert操作,mongo保存的結果如圖: 
這里寫圖片描述 
list會作為普通的數據存到article里,並不會為Picture建表,這一點是區別於mysql的級聯存儲的。

在Article里給list加上DBRef注解后就不同了 
這里寫圖片描述 
再次執行添加Article操作后,看結果 
這里寫圖片描述 
發現就不再是直接顯示的Picture的各個屬性了,而是只保存了Picture的id和namespace,同時仍然沒有創建Picture的collection(等同於mysql的表)。 
如此此時查詢該Article,會發現list為空,並沒有關聯上Picture的值。其實上一步已經發現了,系統並沒有去創建Picture的表。那即便Article關聯了PictureList的id,也是無法查詢的。 
官方解釋: 
The mapping framework does not handle cascading saves. If you change an Account object that is referenced by a Person object, you must save the Account object separately. Calling save on the Person object will not automatically save the Account objects in the property accounts.意思就是不會處理級聯保存,你必須單獨處理關聯的對象。 
現在修改一下添加Article的代碼,先做Picture的持久化操作。 
這里寫圖片描述 
再看結果,發現Picture已經被持久化,再次查詢該Article時,相應的Picture也全部查了出來。 
如果在Article里刪除關聯的list,set為null並保存,系統只會刪掉Article里關聯的list,而Picture對象本身的數據是不會被刪除的。 
從上面看來,貌似DBRef比較雞肋,而且甚至有時還會帶着誤導的性質,譬如Article關聯了兩個空的Picture時在Article還能看到2個對象的引用,然后2個對象並不存在,是查詢不出來的。 
那么這個標簽存在的意義何在?官方的說法是: 
In short,the best time to use DBRefs are when you’re storing heterogeneous references to documents in different collections.like when you want to take advantage of some additional DBRef-specific 
functionality in a driver or tool. 
實際使用中,感覺貌似作用是在不同的表做划分吧,有點模擬mysql外鍵的意思。免得數據都落到一個大表的,不便於做關聯的表的查詢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM