使用mongoose / mongodb来从数组中提取嵌套数据

时间:2015-11-08 04:44:44

标签: node.js mongodb mongoose mongodb-query

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

articles: [ 

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

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

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

]

我该如何使用

  

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

通过检查hashtag的值来查看该数组中的远程对象是否与模式匹配?

例如,如果我想删除articles数组中的对象,其中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

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

1 个答案:

答案 0 :(得分: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
   }
)

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