【问题标题】:Remove a specific id from all the collections in single query mongodb从单个查询 mongodb 中的所有集合中删除特定 id
【发布时间】:2018-09-17 04:56:23
【问题描述】:

我有评论收藏

{
    "_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

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

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

    1. 使用venue 文档的_id 值删除场地文档。您可以使用findByIdAndRemove(),它还会为您提供已删除的venue 文档。
    2. 使用此venue 文档的_id,您可以查询Reviews 集合以删除在其venue 属性中具有_idvenue 的所有Reviews 文档作为参考。

    示例代码

    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 时,与该 venue 关联的 reviews 将从架构级别删除。

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

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

    【讨论】:

    • 谢谢Ankit...但是可以删除单个查询...听说批量查询但是不知道怎么用。
    • @AshishChoudhary 编辑了我的答案。现在检查。这应该对你有帮助。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 2020-09-03
      • 2015-02-28
      • 1970-01-01
      • 2016-07-29
      相关资源
      最近更新 更多