【问题标题】:Use mongoose / mongodb to $pull nested data from an array使用 mongoose / mongodb 从数组中 $pull 嵌套数据
【发布时间】:2016-02-09 00:27:31
【问题描述】:

假设我在 Mongoose 架构上有这个数组属性('articles'):

articles: [ 

 {
  kind: 'bear',
  hashtag: 'foo'    
 },

 {
  kind: 'llama',
  hashtag: 'baz',
  },

 {
  kind: 'sheep',
  hashtag: 'bar',
  }

]

如何使用

$pullhttps://docs.mongodb.org/manual/reference/operator/update/pull/

通过检查标签的值来查看它是否与模式匹配来从这个数组中远程对象?

例如,如果我想删除文章数组中 hashtag='foo' 的对象。

我的最佳猜测如下,但它似乎不起作用:

   var data = {
        "$pull": {
            "articles": {
                "$elemMatch": {
                    "hashtag": "foo"
                }
            }
        }
    };

Model.update({},data);  //doesn't quite work

这似乎有效:

   var data = {
        "$pull": {
            "articles": {
                "hashtag": 'foo'
            }
        }
    };

 Model.update({},data);  //seems to work

如果您有更好的解决方案,或者您可以提供替代解决方案,请提供答案,谢谢

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    $pull 运算符本身基本上是一个“迷你查询”,因此像 $elemMatch 这样的运算符变得无关紧要,因为无论如何直接对每个数组成员执行“查询”。

    这样:

    Model.update(
       {},
       { "$pull": { "articles": { "hashtag": "foo" }},
       { "multi": true },
       function(err,numAffected) {
           // handle result here
       }
    )
    

    所以它在所有数组文档中寻找(正确的)指定数组中匹配的属性,然后在匹配的地方删除它们。

    .update() 也只返回受影响文档的数量,当您希望更新多个文档时,通常与{ "multi": true } 一起使用。

    如果您只是在寻找“一个”文档,或者期望修改后的文档作为响应,那么请改用.findOneAndUpdate()

    Model.findOneAndUpdate(
       {},
       { "$pull": { "articles": { "hashtag": "foo" }},
       { "new": true },
       function(err,numAffected) {
           // handle result here
       }
    )
    

    虽然没有任何选择标准,但实际上并不实用,因为这只会更新集合中找到的第一个文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 2015-01-31
      相关资源
      最近更新 更多