mongodb – 在数组中拉出数组

类似于
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" : []
}
点赞