MongoDB如何使用Spring Cryteria从嵌套对象数组

时间:2016-02-24 11:12:59

标签: 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("56cc3c908f5e6c56e677bd2e")
                )
        );
        Update update = new Update().unset("sections.sectionId");
        mongoTemplate.updateMulti(query, update, Offer.class);

查询是找到propper元素但是Update有问题,我不知道删除是什么不起作用。

任何人都能帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:4)

因为无论如何我需要练习,这里有一个猜测就像你想要的那样。

Query query = Query.query(Criteria
                .where("sections")
                .elemMatch(
                        Criteria.where("sectionId").is("56cc3c908f5e6c56e677bd2e")
                )
        );

Update update = 
   new Update().pull("sections", 
       new BasicDBObject("sectionId", "56cc3c908f5e6c56e677bd2e"));

mongoTemplate.updateMulti(query, update, Offer.class);

导致

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

答案 1 :(得分:3)

无需查询

Update update = 
   new Update().pull("sections", 
       new BasicDBObject("sectionId", "56cc3c908f5e6c56e677bd2e"));

mongoTemplate.updateMulti(new Query(), update, Offer.class);

该解决方案完美无缺。

答案 2 :(得分:0)

我认为接受的答案不一定适用于 BAsicDbObject 类的所有情况。 Springboot 需要您尝试拉/删除的对象的类才能正确映射它,所以我是这样做的:

var sectionToRemove = new Section()
        . sectionId("56cc3c908f5e6c56e677bd2e");

var updateAction = new Update().pull("sections", sectionToRemove);

var res = mongoOps.updateMulti(query, updateAction, Section.class);