因为$pull
试图从"favorites"
数组中删除匹配的元素,它不工作。你想要做的是从“阵列内部的阵列”删除收藏夹。
为此,您需要的位置匹配指向nth
内部元件,然后非常小心$pull
表达真正删除元素:
Meteor.users.update(
{ "favorites": { "$elemMatch": { "$elemMatch": { "$eq": 5719 } } } },
{ "$pull": { "favorites.$": 5719 } }
)
“双节” $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
。
由于$pull
已经适用于数组,所以声明的其余部分有一个“少”$elemMatch
。
从外阵列删除整个匹配元素:
{
"_id" : "FfEj5chmviLdqWh52",
"favorites" : []
}
为什么更安全?这实际上是一种宠物,因为太多的人使用'$ in',因为他们“认为”**在数组匹配时必须使用**。用例实际上是相反的,您提供了可能与该属性相匹配的“参数数组”。您是在删除基于匹配单个条件的元素之后。我看不出为什么一个“数组”使这个清晰或安全。成为代码似乎被没收。 –
似乎这个位置可能会被考虑在内,但是我从文档中了解到它的行为与您的代码相同。 –
那么,为什么要提交一个“答案”,说明你认为它以任何方式更安全或更好?你不能说*“我一直都知道这一点”*当你的问题没有提出这样的陈述时。你的问题实际上表明,*“我不知道该怎么做”*,然后有人很高兴向你展示。考虑到误导性标题和所有内容。 –