SpringBoot中MongoDB注解概念及使用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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外键的意思。
免得数据都落到⼀个⼤表的,不便于做关联的表的查询。