Spring MongoTemplate更新合并

时间:2017-04-24 14:38:36

标签: spring merge spring-data mongotemplate

使用spring的mongoTemplate或者如何在现有mongo文档上执行简单合并?

当我说合并时,我希望发生以下情况:

  1. 如果修改器文档中的字段存在于文档的后端版本中,则使用修饰符中的新值更新它。
  2. 如果后端版本中不存在修饰符文档中的字段,则添加该字段。
  3. 单独留下Backend文档中的所有其他字段。

2 个答案:

答案 0 :(得分:1)

如果您想使用MongoTemplate执行合并,您可以执行以下操作:

this.mongoTemplate.update**(<your_criteria>, 
Update.fromDBObject(BasicDBObjectBuilder.start("$set", 
<your_object>).get()), <output>.class)

样品:

BasicDBObject dbObject = new BasicDBObject("a", 1);
Query query = Query.query(Criteria.where("_id").is("123");
Update update = Update.fromDBObject(BasicDBObjectBuilder.start("$set", 
dbObject).get());

this.mongoTemplate.updateFirst(query, update, BasicDBObject.class, 
"my_collection");

您基本上使用$ set更新要传递的对象中的所有现有值。我不确定它是否是最优雅的方式,但效果很好。

我没有在这里介绍upsert案例,因为我假设你知道文档已经存在以便创建更新标准。

答案 1 :(得分:0)

您想要执行upsert,对吗? 这应该可以正常工作:

    //suppose that you are trying to get user with Id=abs
    Query query = new Query();
    query.addCriteria(where(ID).is("abc"));

    //and then you can add or update the new field (if the field does not exist, the template adds it into the document)
    Update update = new Update();
    update.set("addThisField", new Date());

    mongo.upsert(query, update, User.class);

此查询基本上搜索id为“abc”的用户。如果用户具有名为 addThisField 的字段,则会执行更新。如果用户没有该字段,则会将该字段添加到文档中。

我用弹簧靴1.4测试了它