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

2022-09-02 02:52:58

这是一个简单的pojo:

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

请参阅以下代码,通过春季MongoTemplate将一个应用到MongoDb:upsert

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

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

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

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

例如:

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

请注意,我的 pojo 不会扩展 。DBObject


答案 1

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

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

答案 2

新的spring-data-mongodb版本2.X.X的解决方案。

API已经发展,自2.X.X版本以来有:

Update.fromDocument(org.bson.Document object, String... exclude)

而不是 (1.X.X):

Update.fromDBObject(com.mongodb.DBObject object, String... exclude)

完整的解决方案:

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

它的工作原理!