我有评论集
{
"_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,
}
如何删除Reviews
和Events
删除相应的Venue
答案 0 :(得分:0)
创建单个查询以执行要删除的集合及其相关集合的删除操作非常困难。但是,你能做的是:
_id
文档的venue
值删除场地文档。您可以使用findByIdAndRemove()
,它还会为您提供已删除的venue
文档。_id
文档的venue
,您可以查询Reviews
集合,以删除Reviews
_id
venue
个文档在venue
属性中作为参考。示例代码
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"
}]
}
上述文件架构将有助于将场地及其相关评论和事件的删除操作整合到一个操作中。