如何使用Spring数据mongoDB执行部分更新(MongoOperations)

时间:2016-12-29 10:34:31

标签: mongodb spring-data

在我的数据库中,我有一个看起来像这样的文档

{
    "_id" : ObjectId("5864ddd8e38112fd70b89893"),
    "_class" : "com.apic.models.UserReg",
    "name" : "Bijay",
    "email" : "apic.apps@gmail.com",
    "psd" : "16d932a5a3da90cc6afd831016b5a6821f0badf7e2c624159205924433613c3a",
    "activationToken" : "fe8376ea2dbdf61ebc0f11a2361d741ba3178362d5bf876cf47e6a126bc5b39c",
    "verified" : false
}

我也有一个看起来像这样的bean

public class User {
  @Id
  private int id;
  private String name;
  private String email;

  // getter/setter methods

}

因此,当我尝试调用save()的{​​{1}}方法时,它会替换所有缺少的属性,如psd,verified和activationToken。

MongoOperations

有什么方法可以只更新模型类中的现有属性并保留其他属性吗?

3 个答案:

答案 0 :(得分:6)

如果要设置任意数量的字段(但不要覆盖其他字段),可以向模型添加一个函数,将其转换为Map。如果您Spring明显Jackson is a good choice for this

从那里,您可以删除所有null值,然后将具有值的每个字段添加到$set操作。

Map<String, Object> objectMap = user.toMap();
    objectMap.values().removeIf(Objects::isNull);
    Update update = new Update();
    objectMap.forEach(update::set);

    return mongoOperations.findAndModify(
            Query.query(Criteria.where("_id").is(user.getId())), update, User.class);

答案 1 :(得分:3)

是的,您可以致电选择性更新

Example:

test2.jsp in server2
<html>
<head><title>First JSP</title></head>
<body>
 <a href="http://www.test.com">Try Again</a>
</body>
</html>

答案 2 :(得分:0)

根据@Rossiar的回答,我们可以使用MongoConverter而不是Jackson

Document document = new Document();
mongoOperations.getConverter().write(user, document);
Update update = new Update();
document.forEach(update::set);
return mongoOperations.findAndModify(
            Query.query(Criteria.where("_id").is(user.getId())), update, User.class);