从单个查询mongodb中的所有集合中删除特定的id

时间:2018-04-07 07:35:54

标签: node.js mongodb mongoose mongodb-query

我有评论集

{
    "_id" : ObjectId("5ac47af5e935d927a03518ac"),
    "venue" : ObjectId("5abc9436b7c99332f0a68136"),
    "content" : "gfhfghfghfghf",
}

我有活动收集

{
    "_id" : ObjectId("5abce7208b9efa5a6b8e739b"),
    "venue" : ObjectId("5abc9436b7c99332f0a68136"),
    "description" : "22222222222222222222222222222222222222",
}

我有场地集合

{
    "_id" : ObjectId("5abc9436b7c99332f0a68136"),
    "name" : "ASA College - Manhattan Campus",
    "addedBy" : ObjectId("5abc93a85d3914318cc8d3d7"),
    "__v" : 0,
}

如何删除ReviewsEvents删除相应的Venue

2 个答案:

答案 0 :(得分:0)

创建单个查询以执行要删除的集合及其相关集合的删除操作非常困难。但是,你能做的是:

  1. 使用_id文档的venue值删除场地文档。您可以使用findByIdAndRemove(),它还会为您提供已删除的venue文档。
  2. 使用此_id文档的venue,您可以查询Reviews集合,以删除Reviews _id venue个文档在venue属性中作为参考。
  3. 示例代码

    Venue.findByIdAndRemove(idOfVenue, function (err, venueObj) {
        if(err){
          console.log('Error in deleting Venue');
        } else {
          Reviews.remove({venue: venueObj._id}, function (err) {
            if (err) {
              console.log('Error in deleting Reviews');
            } else {
              console.log('Record deleted successfully!!');
            }
          });
        }
      });
    

    但是,您可以设置架构,以便在删除venue时,从架构级别删除与reviews关联的venue

    // Remove Venue
    Venue.remove({_id: vanueId}, function (err) {
        if (err) {
           console.log('Error in removing venue');
        }
    });
    
    //Remove Reviews related to venue, this code is placed in Venue schema
    VenueSchema.pre('remove', function(next) {
        this.model('Reviews').remove({ venue: this._id }, next);
    });
    

    pre操作中使用remove将首先从Reviews集合中删除记录,然后从Venue集合中删除记录。因此,您只有一个查询要删除Venue记录。从Reviews移除Venue的架构级别处理。

答案 1 :(得分:0)

作为NoSQL数据库的MongoDB不支持关系,相反,它有助于使用嵌入式文档定义关系模型。

根据上述描述,要删除与特定场所相关的所有评论和事件,删除操作需要执行多个步骤,第一步执行删除操作,使用场地过滤器删除所有评论和事件,然后进入第二步使用表示场地Id字段的_id的过滤器执行删除场地的操作

或者,可以将事件和评论定义为场地文档中的嵌入文档,如下面的示例所述。

{
    "_id": ObjectId("5abc9436b7c99332f0a68136"),
    "name": "ASA College - Manhattan Campus",
    "addedBy": ObjectId("5abc93a85d3914318cc8d3d7"),
    "__v": NumberInt(0),
    "reviews": [{
        "content": "gfhfghfghfghf"
    }],
    "events": [{
        "description": "22222222222222222222222222222222222222"
    }]
}

上述文件架构将有助于将场地及其相关评论和事件的删除操作整合到一个操作中。