MongoDB从子子数组中删除所有匹配项

时间:2019-02-21 23:59:52

标签: mongodb

只是想知道实现此目标的最佳方法是什么。我可以想到一些复杂的方法,但它们似乎不正确。

我想要做的是从文档中删除所有子数组对象。如下所示:

SCHEMA

schema {
  person: Array<{
    id: string;
    posts: Array<{
      id: string,
      comments: Array<{
        id: string
        tagged_person_id: string;
      }>
    }>
  }>
}

我正在寻找某种方法来删除评论中具有tagged_person_id == some_id的每个人在每个帖子中的所有评论。这不是我的实际用例,但是它代表了相同的概念。

我知道如何使用$pull从一个子文档的子数组中删除,但是只是不确定如何在一个查询中完成所有这些操作,或者甚至不可能。

1 个答案:

答案 0 :(得分:0)

根据JIRA票据SERVER-1243documentation,从MongoDB v3.5.12开始,给出以下文档:

{
    "posts" : [ 
        {
            "comments" : [ 
                {
                    "tagged_person_id" : "x"
                }, 
                {
                    "tagged_person_id" : "y"
                }
            ]
        }, 
        {
            "comments" : [ 
                {
                    "tagged_person_id" : "x"
                }
            ]
        }, 
        {
            "comments" : [ 
                {
                    "tagged_person_id" : "y"
                }
            ]
        }
    ]
}

您可以运行此更新:

db.collection.update({}, {
    $pull : {
        "posts.$[].comments" : {"tagged_person_id": "x"}
    }
})

以便删除tagged_person_id等于"x"的所有注释。

结果:

{
    "posts" : [ 
        {
            "comments" : [ 
                {
                    "tagged_person_id" : "y"
                }
            ]
        }, 
        {
            "comments" : []
        }, 
        {
            "comments" : [ 
                {
                    "tagged_person_id" : "y"
                }
            ]
        }
    ]
}