版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 PAGE 6Spring Data MongoDB 核心功能简介Spring Data MongoDB Indexes, Annotations and Converters概述本文将探讨Spring Data MongoDB的一些核心功能 - 索引,常用注释和转换器。索引Indexed此注解将该字段标记为MongoDB中的索引:QueryEntity Documentpublic class User Indexedprivate String name;.现在name字段已经被标记为索引 - 让我们看一下MongoDB中的索引:db.user.getIndexes();这是数据库层面所展
2、示的:v : 1,key : _id : 1,name : _id_,ns : test.user,v : 1,key : name : 1,name : name,ns : test.user如您所见,我们有两个索引 - 一个是_id - 由Id注解默认创建,另一个是name字段。以编程方式创建索引我们可以以编程方式创建索引mongoOps.indexOps(User.class).ensureIndex(new Index().on(name, Direction.ASC);我们已经为name字段创建索引,其结果与上一节相同。复合索引MongoDB支持复合索引,其中单个索引结构包含对多个字
3、段的引用。 让我们看一个使用复合索引的例子:QueryEntity Document CompoundIndexes(CompoundIndex(name = email_age, def = email.id : 1, age: 1)public class User /我们使用email和age字段创建了一个复合索引。现在让我们看看实际的索引:v : 1,key : email.id : 1,age : 1,name : email_age,ns : test.user请注意,DBRef字段不能用Index标记 - 该字段只能是复合索引的一部分。常用注解Transient正如您所料,这个简
4、单的注释排除了字段在数据库中的持久性:public class User Transientprivate Integer yearOfBirth;123/ standard getter and setter我们插入带yearOfBirth字段的user对象:User user = new User(); user.setName(Alex); user.setYearOfBirth(1985); mongoTemplate.insert(user);现在,如果我们查看数据库的状态,我们会看到提交的yearOfBirth没有被保存:_id : ObjectId(55d8b30f758fd3c
5、9f374499b), name : Alex,age : null所以如果我们查询并检查:mongoTemplate.findOne(Query.query(Criteria.where(name).is(Alex), User.class).getYearOfBirth()查询结果是空的。FieldField说明用于JSON文档中字段的键:Field(email)private EmailAddress emailAddress;现在emailAddress通过email保存到数据库:_id : ObjectId(55d076d80bad441ed114419d),name : Brend
6、an, age : null,email : value : HYPERLINK mailto:a a数据库状态:_id : ObjectId(55d076d80bad441ed114419d), name : Brendan,age : null,email : value : HYPERLINK mailto:a a3.3. PersistenceConstructor and ValuePersistenceConstructor将构造函数(即使是受保护的包构造函数)标记为持久性逻辑使用的主要构造函数。构造函数参数按名称映射到检索到的DBObject中的键值。我们看一下User类的构造器
7、:PersistenceConstructorpublic User(String name, Value(#root.age ?: 0) Integer age, EmailAddress emailAddress) = name;this.age = age;this.emailAddress = emailAddress;注意这里使用标准的Spring Value注解。这个注释可以帮助我们使用Spring Expressions转换从数据库中检索的键值,然后再将其用于构造域对象。这是一个非常强大且有用的功能。User user = new User(); user.setName(Ale
8、x); mongoTemplate.insert(user);在我们的示例中,如果未设置age,则默认情况下将设置为0。现在我们看下它是如何工作的:我们将看到数据库:_id : ObjectId(55d074ca0bad45f744a71318), name : Alex,age : null所以age字段为null,但是当我们查询数据记录并检索年龄时:mongoTemplate.findOne(Query.query(Criteria.where(name).is(Alex), User.class).getAge();结果是0.Converters现在让我们看看Spring Data Mo
9、ngoDB中的另一个非常有用的功能 - 转换器,特别是MongoConverter。这用于在存储和查询这些对象时处理所有Java类型到DBObject的映射。我们有两个选项 - 我们可以在早期版本中使用MappingMongoConverter或SimpleMongoConverter(这在Spring Data MongoDB M3中已被弃用,其功能已移至MappingMongoConverter中)。或者我们可以编写自己的自定义转换器。为此,我们需要实现Converter接口并在MongoConfig中注册 实现。让我们看一个简单的例子。正如您在此处的一些JSON输出中看到的那样,保存在数
10、据库中的所有对象都具有自动保存的字段_class。但是,如果我们想在持久化期间跳过该特定字段,我们可以使用MappingMongoConverter来实现。首先 - 这是自定义转换器实现:Componentpublic class UserWriterConverter implements Converter Overridepublic DBObject convert(User user) DBObject dbObject = new BasicDBObject(); dbObject.put(name, user.getName(); dbObject.put(age, user.g
11、etAge();if (user.getEmailAddress() != null) DBObject emailDbObject = new BasicDBObject(); emailDbObject.put(value, user.getEmailAddress().getValue(); dbObject.put(email, emailDbObject);dbObject.removeField(_class); return dbObject;private ListConverter converters = new ArrayListConverter();Overridep
12、ublic CustomConversions customConversions() 请注意我们如何通过直接在此处直接删除字段来轻松实现不持久化_class的目标。现在我们需要注册自定义转换器: PAGE 7converters.add(new UserWriterConverter(); return new CustomConversions(converters);如果我们需要:我们当然可以使用XML配置达得相同的结果:现在我们保存新的user对象:User user = new User(); user.setName(Chris); mongoOps.insert(user);数据库中生成的记录不再包含类信息:_id : ObjectId(55cf09790bad4394db84b853), name : Chris
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年甘孜县带编教师招聘笔试模拟试题及答案解析
- 2026年申扎县带编教师招聘考试备考题库及答案解析
- 2026年墨玉县带编教师招聘笔试备考试题及答案解析
- 2026年临朐县带编教师招聘考试备考试题及答案解析
- 2026年会东县带编教师招聘考试参考题库及答案解析
- 2026年大悟县带编教师招聘笔试参考题库及答案解析
- 2026年定日县带编教师招聘考试备考试题及答案解析
- 2026年安泽县带编教师招聘笔试参考题库及答案解析
- 2026年布拖县带编教师招聘笔试模拟试题及答案解析
- 2026年青阳县带编教师招聘考试备考试题及答案解析
- 智慧公路交通讲座-日本的智能交通与智慧公路
- 2024年新北师大版一年级上册数学全册课件(2024年新教材)
- 基于PLC的点胶机的控制系统设计
- 法律顾问服务投标方案(完整技术标)
- 多维阅读第13级-A-Big-Mistake-大错特错
- 陕22N1 供暖工程标准图集
- 湖南高速铁路职业技术学院单招职业技能测试参考试题库(含答案)
- 大运河-我们身边的世界文化遗产课件
- 茶文化与茶艺(高职)全套教学课件
- 季度GDP统一核算方法解读
- 员工手册(员工管理手册)
评论
0/150
提交评论