与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}}}})
答案 0 :(得分:2)
它不起作用,因为$pull
正在尝试从"favorites"
数组中删除匹配的元素。你想要做的是从数组内的"数组中删除 。
为此你需要一个位置匹配指向nth
内部元素,然后一个非常小心的$pull
表达式来实际删除该元素:
Meteor.users.update(
{ "favorites": { "$elemMatch": { "$elemMatch": { "$eq": 5719 } } } },
{ "$pull": { "favorites.$": 5719 } }
)
" double"使用$elemMatch
运算符的$eq
比{ 0: 5719 }
更具表现力,因为它不会被锁定"仅进入第一个位置,实际上是在查看匹配值。但是你可以这样写,如果你必须,或者如果你真的意味着"仅在第一个位置匹配该值。
请注意"索引"从positional $
参数中的匹配返回的实际上是"外部"阵列。所以从
当然如果其中只有一个嵌套数组元素,你可以写一下:
{ "$pull": { "favorites.0": 5719 } }
使用直接"第一个索引"位置,因为你知道内部数组将永远存在。
在任何一种情况下,您的对象都会正确更新:
{
"_id" : "FfEj5chmviLdqWh52",
"favorites" : [
[
"2016-03-21T17:46:01.441Z",
"a"
]
]
}
如果您尝试$pull
来自收藏夹的整个数组条目,则$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" : []
}
答案 1 :(得分:0)
这是我发现的第一个实际可行的代码:
Meteor.users.update(Meteor.userId(), {$pull: {favorites: {$in: [i]}}})
显然$in
会进行部分匹配。它似乎比this answer的工作代码更安全:
Meteor.users.update(
{ "_id": this.userId },
{ "$pull": { "favorites": { "$elemMatch": { "$eq": i } } } }
)