【问题标题】:Delete element from deeply nested array, express mongodb从深层嵌套数组中删除元素,表达mongodb
【发布时间】:2017-08-19 13:30:46
【问题描述】:

我的深度嵌套数组结构是这样的:

user {
    "_id" : ObjectId("58d6aedc7b9785e422d89ab7"),
    "email" : "blah",
    "password" : "blah",
    "username" : "blah",
    "places" : [ {
         "_id" : ObjectId("58d85c63d6270650fa05a674"),
         "description" : "blah blah",
         "country" : "blah",
         "state" : "blah",
         "latitude" : "-23",
         "longitude" : "12",
         "name" : "blah blah",
         "photos" : [
             {
                 "name" : "blah",
                 "photo_url" : "vhttp://blahblah.com",
                 "_id" : ObjectId("58d85c7ad6270650fa05a675")
             },
             {
                 "name" : "blah",
                 "photo_url" : "blah blah",
                 "_id" : ObjectId("58d85cc9d6270650fa05a676")
            }
        ]
    }]
    "__v" : 0
}

任何人都可以帮助编写一个猫鼬查询以根据其 ID 删除特定的照片对象吗?我尝试了以下查询,但它不起作用:

User.update(
    {'_id': req.params.userId},
    {'places._id': req.params.placesId },
    { $pull: { "photos" : { id: req.params.id } } },
false,
true
);

【问题讨论】:

    标签: arrays node.js mongodb express mongodb-query


    【解决方案1】:

    您的查询有几个问题:

    1. 您试图指定两个条件,但您已将它们作为单独的参数提交;您需要将它们组合成第一个conditions parameter
    2. 在您的更新参数中,您指定了键“照片”;但该键不存在于文档的顶层。要作用于嵌套的键,您需要使用dot notation;并在数组中挑选出一个匹配的文档,您需要 $ positional operator
    3. 正如 Shumi Gupta 所指出的,_id 字段应准确命名,并带有前导下划线

    要解决这些问题,您的更新查询应如下所示:

    User.update(
      {"_id": req.params.userId, "places._id": req.params.placesId },
      { $pull: { "places.$.photos" : { "_id": req.params.id } } },
      false,
      true
    );
    

    注意:您的第三个和第四个参数,布尔值,似乎与mongoose Update call 所需的参数不匹配;但是,我不是 Mongoose 的专家,您可能使用的是结构正确的旧版本。

    【讨论】:

      猜你喜欢
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 2022-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多