对 $pullAll 在 MongoDB 中如何工作感到困惑

发布于 2024-11-05 13:57:09 字数 1267 浏览 0 评论 0原文

我有一个如下所示的文档:

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"
}

如果我运行查询

db.blog.update({'blogid':1}, { $pull : { 'comments' : {'approved' : 0} } });

那么它将删除第三条评论。

相反,如果我想提取已批准为 0 或 1 的所有评论,则以下查询不起作用:

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

我收到错误

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

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

谢谢

I've got a document that looks like this:

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"
}

If I run the query

db.blog.update({'blogid':1}, { $pull : { 'comments' : {'approved' : 0} } });

Then it will remove the third comment.

If instead I want to pull all comments where approved is 0 or 1 the following query doesn't work:

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

I get the error

Modifier $pushAll/pullAll allowed for
arrays only

Can someone please explain where I'm going wrong?

Thank you

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

┈┾☆殇 2024-11-12 13:57:09

$pullAll 需要完全匹配。您可以使用 $pull 代替:

{ $pull : { 'comments' : {'approved' : {$in : [0,1]}} } });

$pullAll requires an exact match. You might use $pull instead:

{ $pull : { 'comments' : {'approved' : {$in : [0,1]}} } });
孤独患者 2024-11-12 13:57:09

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

{ $pullAll : { 'comments' : [{'approved' : 1}, {'approved' : 0}] } });

This is because $pullAll takes array, not an object. I guess follwing code should work:

{ $pullAll : { 'comments' : [{'approved' : 1}, {'approved' : 0}] } });
扬花落满肩 2024-11-12 13:57:09
db.blog.update({"blogid":1},{$pullAll:{"comments":{"name":"Phil","comment":{$eq:"Test"}}}})

WriteResult({
        "nMatched" : 0,
        "nUpserted" : 0,
        "nModified" : 0,
        "writeError" : {
                "code" : 2,
                "errmsg" : "$pullAll requires an array argument but was given a object"
        }
})

db.blog.update({"blogid":1},{$pull:{"comments":{"name":"Phil","comment":{$eq:"Test"}}}})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

$pull update 运算符:

  • 如果元素是数组或带有对象的数组,它会起作用。
  • 即使您在查询语法中使用任何条件运算符,它也能正常工作。

$pullAll 更新运算符:

  • 仅当元素是数组时才有效。
  • 仅当您在查询语法中不使用任何条件运算符时它才有效
db.blog.update({"blogid":1},{$pullAll:{"comments":{"name":"Phil","comment":{$eq:"Test"}}}})

WriteResult({
        "nMatched" : 0,
        "nUpserted" : 0,
        "nModified" : 0,
        "writeError" : {
                "code" : 2,
                "errmsg" : "$pullAll requires an array argument but was given a object"
        }
})

db.blog.update({"blogid":1},{$pull:{"comments":{"name":"Phil","comment":{$eq:"Test"}}}})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

$pull update operator:

  • It works if the element is either array or array with Object.
  • It works even if you use any condition operator in query syntax.

$pullAll update operator:

  • It only works if the element is array.
  • It only works if you don't use any condition operator in query syntax
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文