首页 文章

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

提问于
浏览
0

说我在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的值以查看它是否与模式匹配来从此数组远程对象?

例如,如果我想删除items数组中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 回答

  • 1

    $pull运算符本身基本上是"mini query",因此像 $elemMatch 这样的运算符变得无关紧要,因为"query"无论如何都直接在每个数组成员上执行 .

    因此:

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

    因此,它在所有数组文档中的(正确的)指定数组中查找匹配的属性,然后在匹配的位置删除它们 .

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

    如果您只是在寻找"one"文档,或者希望修改后的文档作为回应,那么请改用.findOneAndUpdate()

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

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

相关问题