说我在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
如果您有更好的解决方案或者您可以展示替代解决方案,请提供答案谢谢
答案 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
}
)
虽然没有任何选择标准,但实际上并不实用,因为这只会更新集合中的第一个文档。