MongoDB如何使用Spring Query Update更新数组中的元素

时间:2016-02-24 19:37:43

标签: spring mongodb

在我的项目中,我使用的是SpringBoot 1.3.2和org.springframework.data.mongodb.core.query。*

我试图更新数组中的元素,在我的主对象中,我的数组看起来像这样:

"sections" : [
        {
                "sectionId" : "56cc3c908f5e6c56e677bd2e",
                "name" : "Wellcome"
        },
        {
                "sectionId" : "56cc3cd28f5e6c56e677bd2f",
                "name" : "Hello my friends"
        }
]

使用Spring我想用sectionId 56cc3c908f5e6c56e677bd2e更新记录名称

我试图这样做,但它没有工作

  Query query = Query.query(Criteria
                .where("sections")
                .elemMatch(
                        Criteria.where("sectionId").is(editedSection.getId())
                )
        );
        Update update = new Update().set("sections", new BasicDBObject("sectionId", "56cc3c908f5e6c56e677bd2e").append("name","Hi there"));
        mongoTemplate.updateMulti(query, update, Offer.class);

它创建了类似的东西:

"sections" : {
         "sectionId" : "56cc3c908f5e6c56e677bd2e",
         "name" : "Hi there"
 }

但上面是对象{}我想要一个数组[],我不希望它删除其他元素。

任何正文都可以帮我解决如何使用Spring更新sectionId 56cc3c908f5e6c56e677bd2e的记录名称

2 个答案:

答案 0 :(得分:9)

您基本上想要复制此mongo shell更新操作:

db.collection.update(
    { "sections.sectionId": "56cc3c908f5e6c56e677bd2e" },
    {
        "$set": { "sections.$.name": "Hi there" }
    },
    { "multi": true }
)

等效的Spring Data MongoDB代码如下:

import static org.springframework.data.mongodb.core.query.Criteria.where;
import static org.springframework.data.mongodb.core.query.Query;
import static org.springframework.data.mongodb.core.query.Update;

...

WriteResult wr = mongoTemplate.updateMulti(
    new Query(where("sections.sectionId").is("56cc3c908f5e6c56e677bd2e")),
    new Update().set("sections.$.name", "Hi there"),
    Collection.class
);

答案 1 :(得分:0)

可以使用 BulkOperations 方法来更新文档对象的列表或数组

BulkOperations bulkOps = mongoTemplate.bulkOps(BulkMode.UNORDERED, Person.class);
for(Person person : personList) {
    Query query = new Query().addCriteria(new Criteria("id").is(person.getId()));
    Update update = new Update().set("address", person.setAddress("new Address"));
    bulkOps.updateOne(query, update);
}
BulkWriteResult results = bulkOps.execute();