2016-03-21 63 views

回答

0

这是第一代码我发现,实际工作:

Meteor.users.update(Meteor.userId(), {$pull: {favorites: {$in: [i]}}}) 

$in显然确实部分匹配。这似乎从this answer比工作更安全代码:

Meteor.users.update(
    { "_id": this.userId }, 
    { "$pull": { "favorites": { "$elemMatch": { "$eq": i } } } } 
) 
+0

为什么更安全?这实际上是一种宠物,因为太多的人使用'$ in',因为他们“认为”**在数组匹配时必须使用**。用例实际上是相反的,您提供了可能与该属性相匹配的“参数数组”。您是在删除基于匹配单个条件的元素之后。我看不出为什么一个“数组”使这个清晰或安全。成为代码似乎被没收。 –

+0

似乎这个位置可能会被考虑在内,但是我从文档中了解到它的行为与您的代码相同。 –

+0

那么,为什么要提交一个“答案”,说明你认为它以任何方式更安全或更好?你不能说*“我一直都知道这一点”*当你的问题没有提出这样的陈述时。你的问题实际上表明,*“我不知道该怎么做”*,然后有人很高兴向你展示。考虑到误导性标题和所有内容。 –

2

因为$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" : [] 
} 
+0

谢谢,但我想删除具有指定ID(最喜欢的第一个元素)所有(最好的)的最爱。 –

+0

@CeesTimmerman那么这怎么回事呢?那怎么不是你问的?第一个元素已被删除。 –

+0

我正在查找的ID是收藏夹的第一个元素,应该从收藏夹数组中删除整个收藏夹。你的短代码并没有删除最喜欢的(也不是最喜欢的ID),而你的长代码给了我这个:'MongoError:'收藏夹中的美元($)前缀字段'$ elemMatch'。$ elemMatch'无效存储“。 –