类似于
Find document with array that contains a specific value,但我试图拉它.
db.getCollection('users').find({'favorites':{$elemMatch:{0:5719}}}, {"favorites.$": 1})
返回:
{
"_id" : "FfEj5chmviLdqWh52",
"favorites" : [
[
5719,
"2016-03-21T17:46:01.441Z",
"a"
]
]
}
即使在此之后返回1:
Meteor.users.update(this.userId, {$pull: {'favorites':{$elemMatch:{0:movieid}}}})
最佳答案 它不起作用,因为
$pull
试图从“收藏夹”数组中删除匹配的元素.你想要做的是从收藏夹的“阵列内部”中删除.
为此你需要一个位置匹配指向第n个内部元素,然后一个非常小心的$pull表达式来实际删除该元素:
Meteor.users.update(
{ "favorites": { "$elemMatch": { "$elemMatch": { "$eq": 5719 } } } },
{ "$pull": { "favorites.$": 5719 } }
)
带有$eq
运算符的“double”$elemMatch
比{0:5719}更具表现力,因为它没有“锁定”到第一个位置,实际上是在查看匹配值.但是你可以这样写,如果你必须,或者如果你“真的意味着”只在第一个位置匹配该值.
请注意,从positional $
参数中的匹配返回的“索引”实际上是“外部”数组的索引.所以要从中拉出来
当然,如果里面只有一个嵌套数组元素,你可以写一下:
{ "$pull": { "favorites.0": 5719 } }
使用直接的“第一个索引”位置,因为您知道内部数组将始终存在.
无论哪种情况,您的对象都会正确更新:
{
"_id" : "FfEj5chmviLdqWh52",
"favorites" : [
[
"2016-03-21T17:46:01.441Z",
"a"
]
]
}
如果你试图$从收藏夹中拉出整个数组条目,那么$eleMatch只需要拨回一个元素:
Meteor.users.update(
{ "_id": this.userId },
{ "$pull": { "favorites": { "$elemMatch": { "$eq": 5719 } } } }
)
甚至:
Meteor.users.update(
{ "_id": this.userId },
{ "$pull": { "favorites": { "$elemMatch": { "0": 5719 } } } }
)
注意到:
{ "_id": this.userId },
我们通常用作“查询”选择器的长格式,特别是当我们希望标准“不是”文档的_id时. MiniMongo语句需要“至少”文档的_id.
声明的其余部分有一个“less”$elemMatch,因为$pull已经应用于数组.
这将从外部数组中删除整个匹配的元素:
{
"_id" : "FfEj5chmviLdqWh52",
"favorites" : []
}