vik*_*eve 11 java upsert mongodb mongotemplate
这是一个简单的pojo:
public class Description {
private String code;
private String name;
private String norwegian;
private String english;
}
Run Code Online (Sandbox Code Playgroud)
请参阅以下代码,upsert通过spring MongoTemplate 应用于MongoDb:
Query query = new Query(Criteria.where("code").is(description.getCode()));
Update update = new Update().set("name", description.getName()).set("norwegian", description.getNorwegian()).set("english", description.getEnglish());
mongoTemplate.upsert(query, update, "descriptions");
Run Code Online (Sandbox Code Playgroud)
生成Update对象的行Item手动指定类的每个字段.
但如果我的Item对象发生了变化,那么我的Dao图层会破裂
那么有没有办法避免这样做,以便我的Item类中的所有字段自动应用于更新?
例如
Update update = new Update().fromObject(item);
Run Code Online (Sandbox Code Playgroud)
请注意,我的pojo没有扩展DBObject.
Pan*_*ato 16
我找到了一个很好的解决方案
//make a new description here
Description d = new Description();
d.setCode("no");
d.setName("norwegian");
d.setNorwegian("norwegian");
d.setEnglish("english");
//build query
Query query = new Query(Criteria.where("code").is(description.getCode()));
//build update
DBObject dbDoc = new BasicDBObject();
mongoTemplate.getConverter().write(d, dbDoc); //it is the one spring use for convertions.
Update update = Update.fromDBObject(dbDoc);
//run it!
mongoTemplate.upsert(query, update, "descriptions");
Run Code Online (Sandbox Code Playgroud)
Plz注意到Update.fromDBObject返回一个包含dbDoc中所有字段的更新对象.如果您只想更新非空字段,则应编写新方法以排除空字段.
例如,前端发布如下文档:
//make a new description here
Description d = new Description();
d.setCode("no");
d.setEnglish("norwegian");
Run Code Online (Sandbox Code Playgroud)
我们只需更新字段'language':
//return Update object
public static Update fromDBObjectExcludeNullFields(DBObject object) {
Update update = new Update();
for (String key : object.keySet()) {
Object value = object.get(key);
if(value!=null){
update.set(key, value);
}
}
return update;
}
//build udpate
Update update = fromDBObjectExcludeNullFields(dbDoc);
Run Code Online (Sandbox Code Playgroud)
小智 7
就像前面的答案所说,使用 mongoTemplate.getConverter().write() 和 Update.fromDocument() 函数。但我发现 Update.fromDocument() 不会添加“$set”键并且无法直接工作,解决方案是自己添加“$set”,如下所示(PS:我使用的是 2.2.1.RELEASE 版本):
public static Update updateFromObject(Object object, MongoTemplate mongoTemplate) {
Document doc = new Document();
mongoTemplate.getConverter().write(object, doc);
return Update.fromDocument(new Document("$set", doc));
}
Run Code Online (Sandbox Code Playgroud)
新的spring-data-mongodb版本2.XX的解决方案
API已经发展,从2.XX版本开始,有:
Update.fromDocument(org.bson.Document object, String... exclude)
Run Code Online (Sandbox Code Playgroud)
而不是(1.XX):
Update.fromDBObject(com.mongodb.DBObject object, String... exclude)
Run Code Online (Sandbox Code Playgroud)
完整的解决方案:
//make a new description here
Description d = new Description();
d.setCode("no");
d.setName("norwegian");
d.setNorwegian("norwegian");
d.setEnglish("english");
Query query = new Query(Criteria.where("code").is(description.getCode()));
Document doc = new Document(); // org.bson.Document
mongoTemplate.getConverter().write(item, doc);
Update update = Update.fromDocument(doc);
mongoTemplate.upsert(query, update, "descriptions");
Run Code Online (Sandbox Code Playgroud)
有用!
小智 0
我遇到了同样的问题。在当前的 Spring Data MongoDB 版本中,没有这样的东西可用。您必须手动更新单独的字段。
然而,使用另一个框架是可能的:Morphia。
该框架有一个 DAO 功能的包装器:https ://github.com/mongodb/morphia/wiki/DAOSupport
您可以使用 DAO API 执行以下操作:
SomePojo pojo = daoInstance.findOne("some-field", "some-value");
pojo.setAProperty("changing this property");
daoInstance.save(pojo);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30687 次 |
| 最近记录: |