从深层嵌套数组中删除元素,表示mongodb

时间:2017-03-27 00:44:56

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

我深层嵌套的数组结构如下:

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
}

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

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

1 个答案:

答案 0 :(得分:0)

您的查询存在以下问题:

  1. 您正在尝试指定两个条件,但您已将它们作为单独的参数提交;您需要将它们合并到第一个conditions parameter
  2. 在您的更新参数中,您指定了键"照片&#34 ;;但是这个密钥不存在于文档的顶层。要对嵌套的键执行操作,您需要使用dot notation;要选择数组中的单个匹配文档,您需要$ positional operator
  3. 如Shumi Gupta所述,_id字段应准确命名,带有前导下划线
  4. 要解决这些问题,您的更新查询应如下所示:

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

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