Mat*_*tke 7 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;
}
Run Code Online (Sandbox Code Playgroud)
加载和保存整个Letter对象/文档就像一个魅力.(我使用ObjectId为Section.id字段生成唯一的ID.)
Letter letter1 = mongoTemplate.findById(id, Letter.class)
mongoTemplate.insert(letter2);
mongoTemplate.save(letter3);
Run Code Online (Sandbox Code Playgroud)
由于文档很大(200K),有时应用程序只需要子部分:是否有可能查询子文档(部分),修改并保存它?我想实现一个类似的方法
Section s = findLetterSection(letterId, sectionId);
s.setText("blubb");
replaceLetterSection(letterId, sectionId, s);
Run Code Online (Sandbox Code Playgroud)
当然还有以下方法:
addLetterSection(letterId, s); // add after last section
insertLetterSection(letterId, sectionId, s); // insert before given section
deleteLetterSection(letterId, sectionId); // delete given section
Run Code Online (Sandbox Code Playgroud)
我看到最后三种方法有点"奇怪",即加载整个文档,修改集合并再次保存它可能是从面向对象的角度来看更好的方法; 但第一个用例("导航"到子文档/子对象并在此对象的范围内工作)似乎很自然.
我认为MongoDB可以更新子文档,但SpringData可以用于对象映射吗?谢谢你的任何指示.
Mat*_*tke 15
我想出了以下方法来切片和加载一个子对象.看起来好吗?我知道并发修改的问题.
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);
Run Code Online (Sandbox Code Playgroud)
这是加载所有部分的替代解决方案,但省略其他(大)字段.
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);
Run Code Online (Sandbox Code Playgroud)
这是我用来存储单个集合元素的代码:
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);
Run Code Online (Sandbox Code Playgroud)
很高兴看到Spring Data如何与MongoDB的"部分结果"一起使用.
任何评论高度赞赏!
归档时间: |
|
查看次数: |
11713 次 |
最近记录: |