【发布时间】:2019-12-20 14:23:28
【问题描述】:
我有一个包含子文档数组的文档项目,以及架构任务。 Tasks 有一组带有模式 Comments 的子文档。
const projectSchema = new Schema({
_id: Schema.Types.ObjectId,
name: { type: String, required: true, unique: true },
description: { type: String, default: '' },
tasks: [{ type: Schema.Types.ObjectId, ref: 'Threads' }]
});
module.exports = mongoose.model('Project', projectSchema);
const tasksSchema = new Schema({
projectId: { type: Schema.Types.ObjectId },
_id: Schema.Types.ObjectId,
title: { type: String, required: true },
text: { type: String, required: true },
comments: [{ type: Schema.Types.ObjectId, ref: 'Replies' }]
})
module.exports = mongoose.model('Tasks', tasksSchema);
const commentSchema = new Schema({
taskId: { type: Schema.Types.ObjectId },
_id: Schema.Types.ObjectId,
text: { type: String, required: true }
})
module.exports = mongoose.model('Comment', commentSchema);
当我删除项目文档时,我想删除与该项目相关的每个任务和每个评论。 要删除项目,我使用 findOneAndDelete,所以我设置了一个 post 中间件来删除所有任务
projectSchema.post('findOneAndDelete', function(doc, next) {
mongoose.model('Tasks').deleteMany({ projectId: doc._id }).exec();
next();
})
但现在我不知道如何删除每条评论,因为 deletemany 返回一个带有操作结果的对象。 我应该映射任务数组并每次调用 findOneAndDelete 然后删除每条评论吗?对于很多任务来说,它看起来效率很低。
【问题讨论】:
-
到目前为止,在 mongoDB 中 - 我怀疑是否有办法让 id 在结果中返回。也许您可以先在另一个电话中获取这些 id 并删除相关的 cmets..
-
@srinivasy 我现在按照你说的做,但是对于很多 cmets 或任务来说它看起来效率很低
标签: javascript mongodb express mongoose