MongoTemplate upsert - 从 pojo 进行更新的简单方法(哪个用户已编辑)?

新手上路,请多包涵

这是一个简单的 pojo:

 public class Description {
    private String code;
    private String name;
    private String norwegian;
    private String english;
}

请参阅以下代码,通过 spring MongoTemplate 将 upsert 应用于 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");

生成 Update 对象的行手动指定了 Item 类的每个字段。

但是,如果我的 Item 对象发生变化,那么我的 Dao 层就会中断。

那么有没有办法避免这样做,以便我的 Item 类中的所有字段都自动应用于更新?

例如

Update update = new Update().fromObject(item);

请注意,我的 pojo 没有扩展 DBObject

原文由 vikingsteve 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

我遇到了同样的问题。在当前的 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);

原文由 wvandrunen1982 发布,翻译遵循 CC BY-SA 3.0 许可协议

我为这个问题找到了一个很好的解决方案

//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");

请注意 Update.fromDBObject 返回一个包含 dbDoc 中所有字段的更新对象。如果您只想更新非空字段,您应该编写一个新方法来排除空字段。

例如,前端发布如下文档:

 //make a new description here
Description d = new Description();
d.setCode("no");
d.setEnglish("norwegian");

我们只需要更新字段“语言”:

 //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);

原文由 PaniniGelato 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题