Spring Data MongoDB : Accessing and updating sub documents

标签 spring mongodb spring-data spring-data-document

Spring Data 和 MongoDB 的首次实验非常棒。现在我得到了以下结构(简化):

public class Letter {
  @Id
  private String id;
  private List<Section> sections;
}

public class Section {
  private String id;
  private String content;
}

加载和保存整个 Letter 对象/文档就像一个魅力。 (我使用 ObjectId 为 Section.id 字段生成唯一 ID。)

Letter letter1 = mongoTemplate.findById(id, Letter.class)
mongoTemplate.insert(letter2);
mongoTemplate.save(letter3);

由于文档很大(200K),有时应用程序只需要子部分:是否有可能查询子文档(部分),修改并保存它? 我想实现一个类似的方法

Section s = findLetterSection(letterId, sectionId);
s.setText("blubb");
replaceLetterSection(letterId, sectionId, s);

当然还有这样的方法:

addLetterSection(letterId, s); // add after last section
insertLetterSection(letterId, sectionId, s); // insert before given section
deleteLetterSection(letterId, sectionId); // delete given section

我看到最后三个方法有点“奇怪”,即加载整个文档、修改集合并再次保存它可能是从面向对象的角度来看更好的方法;但是第一个用例(“导航”到子文档/子对象并在该对象的范围内工作)似乎很自然。

我认为MongoDB可以更新子文档,但是SpringData可以用于对象映射吗?感谢您的任何指点。

最佳答案

我想出了以下仅对一个子对象进行切片和加载的方法。好像没问题?我知道并发修改存在问题。

Query query1 = Query.query(Criteria.where("_id").is(instance));
query1.fields().include("sections._id");
LetterInstance letter1 = mongoTemplate.findOne(query1, LetterInstance.class); 
LetterSection emptySection = letter1.findSectionById(sectionId);
int index = letter1.getSections().indexOf(emptySection);

Query query2 = Query.query(Criteria.where("_id").is(instance));
query2.fields().include("sections").slice("sections", index, 1);
LetterInstance letter2 = mongoTemplate.findOne(query2, LetterInstance.class);
LetterSection section = letter2.getSections().get(0);

这是加载所有部分但省略其他(大)字段的替代解决方案。

Query query = Query.query(Criteria.where("_id").is(instance));
query.fields().include("sections");
LetterInstance letter = mongoTemplate.findOne(query, LetterInstance.class); 
LetterSection section = letter.findSectionById(sectionId);

这是我用来存储单个集合元素的代码:

MongoConverter converter = mongoTemplate.getConverter();
DBObject newSectionRec = (DBObject)converter.convertToMongoType(newSection);

Query query = Query.query(Criteria.where("_id").is(instance).and("sections._id").is(new ObjectId(newSection.getSectionId())));
Update update = new Update().set("sections.$", newSectionRec);
mongoTemplate.updateFirst(query, update, LetterInstance.class);

很高兴看到 Spring Data 如何与 MongoDB 的“部分结果”一起使用。

任何评论都非常感谢!

关于Spring Data MongoDB : Accessing and updating sub documents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12006105/

相关文章:

mongodb - 安装 mongodb 版本 >3 树莓派 2

hadoop - Spring 数据 - hadoop 连接

java - 自定义 Spring 身份验证中的角色访问

javascript - 我如何动态更新我的CSS,即我想给用户一个选择字体大小、背景颜色的选项

java - Spring LDAP 名称未找到异常

node.js - 如何修复新的 mongoose 模块和 Nodejs - 昨天才发生

java - NoSQL 数据存储提供程序 : org. hibernate.ogm.datastore.mongodb.impl.MongoDBDatastoreProvider

java - Jpa 存储库保存类型参数 'S' 的推断类型 'S' 不在其范围内

java - 如何使用 Spring Data Neo4j 将 Map (java.util.Map) 对象保留在 NodeEntity 中?

java - Spring创建bean时出错