在数组中拉数组

时间:2016-03-21 18:17:02

标签: mongodb meteor mongodb-query

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}}}})

2 个答案:

答案 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 } } } }
)