困惑于$ pullAll如何在MongoDB中运行

ale*_*bie 9 mongodb

我有一个看起来像这样的文档:

db.blog.findOne()
{
        "_id" : ObjectId("4dc1c938c4bfb4d21a000001"),
        "blogid" : 1,
        "body" : "Lorem ipsum dolor",
        "comments" : [
                {
                        "id" : 1,
                        "name" : "Alex",
                        "comment" : "Test",
                        "approved" : 1
                },
                {
                        "id" : 2,
                        "name" : "Phil",
                        "comment" : "Test",
                        "approved" : 1
                },
                {
                        "id" : 3,
                        "name" : "Joe",
                        "comment" : "Test",
                        "approved" : 0
                }
        ],
        "no_comments" : 11,
        "title" : "Hello world"
}
Run Code Online (Sandbox Code Playgroud)

如果我运行查询

db.blog.update({'blogid':1}, { $pull : { 'comments' : {'approved' : 0} } });
Run Code Online (Sandbox Code Playgroud)

然后它将删除第三条评论.

如果相反,我想要将批准为0或1的所有注释拉出来,则以下查询不起作用:

db.blog.update({'blogid':1}, { $pullAll : { 'comments' : {'approved' : [0,1]} } });
Run Code Online (Sandbox Code Playgroud)

我收到了错误

修饰符$ pushAll/pullAll仅允许数组

有人可以解释我哪里出错吗?

谢谢

Vas*_*iuk 15

$pullAll需要完全匹配.您可以$pull改用:

{ $pull : { 'comments' : {'approved' : {$in : [0,1]}} } });
Run Code Online (Sandbox Code Playgroud)


And*_*ich 3

这是因为 $pullAll 接受数组,而不是对象。我想以下代码应该有效:

{ $pullAll : { 'comments' : [{'approved' : 1}, {'approved' : 0}] } });
Run Code Online (Sandbox Code Playgroud)

  • $pullAll 需要完全匹配 (2认同)
  • 这不会起作用,因为瓦西尔是正确的;请参阅 https://jira.mongodb.org/browse/SERVER-825 (2认同)