在Mongoose中级联样式删除
有没有办法删除Mongoose中的父项的所有子项,类似于使用MySQL的外键?
例如,在MySQL中,我将分配一个外键,并将其设置为级联删除。 因此,如果我要删除一个客户端,所有的应用程序和关联的用户也将被删除。
从顶层:
- 删除客户端
- 删除抽奖
- 删除提交
抽奖和提交都有一个client_id字段。 提交中有一个sweepstakes_id和client_id的字段。
现在,我正在使用下面的代码,我觉得有一个更好的方法。
Client.findById(req.params.client_id, function(err, client) { if (err) return next(new restify.InternalError(err)); else if (!client) return next(new restify.ResourceNotFoundError('The resource you requested could not be found.')); // find and remove all associated sweepstakes Sweepstakes.find({client_id: client._id}).remove(); // find and remove all submissions Submission.find({client_id: client._id}).remove(); client.remove(); res.send({id: req.params.client_id}); });
这是Mongoose 'remove'
中间件的主要用例之一。
clientSchema.pre('remove', function(next) { // 'this' is the client being removed. Provide callbacks here if you want // to be notified of the calls' result. Sweepstakes.remove({client_id: this._id}).exec(); Submission.remove({client_id: this._id}).exec(); next(); });
这样,当你调用client.remove()
会自动调用这个中间件来清理依赖关系。
如果您的引用是以其他方式存储的,例如, client
有一个submission_ids
数组,那么以与接受的答案类似的方式,您可以在submissionSchema
上定义以下submissionSchema
:
submissionSchema.pre('remove', function(next) { Client.update( { submission_ids : this._id}, { $pull: { submission_ids: this._id } }, { multi: true }) //if reference exists in multiple documents .exec(); next(); });
这将在submission.remove()
上从客户端的引用数组中移除提交的 id。
- Ubuntu上安装了什么版本的MongoDB
- 我如何重命名MongoDB中的集合?
- 为什么最终为java.lang.IllegalArgumentExceptionexception为Casbah / Java MongoDB驱动程序?
- 如何在MongoDB数据库中的数据存储在磁盘上?
- 如何selectCassandra,Membase,Hadoop,MongoDB,RDBMS等?
- Spring Data的MongoTemplate和MongoRepository有什么区别?
- 无法validation成mongo,“auth失败”
- 我如何重命名MongoDB中所有文档的字段?
- Node.js / Mongoose上的“VersionError:没有find匹配的文档”错误