【发布时间】:2021-08-03 06:16:05
【问题描述】:
假设我有 4 个这样的模型:
┌────────────┐ ┌────────────┐
│ User │ │ Goal │
├────────────┤ 1 ├────────────┤ 1
│ _id │◄──┐ │ _id │◄──┐
└────────────┘ └──┤ ref_user │ │
1..*└────────────┘ │
│
┌───────────┐ ┌───────────────┐ │
│ Date │ │ Data │ │
├───────────┤ 1 ├───────────────┤ │
│ _id: date │◄─┐ │ _id │ │
└───────────┘ └──┤ ref_date │ │
1 │ ref_goal ├──┘
└───────────────┘ *
我在删除数据时创建了一个pre remove,它会自动删除关联的日期。
DataSchema.pre('remove', async function (next) {
try {
await DateModel.findByIdAndRemove(this.ref_date);
console.log("Date removed");
next();
} catch (err) {
console.log(err);
next(err);
}
});
我面临的问题是,当我删除一个目标时,我希望删除所有关联的数据(它有效)但我希望 DataModel.remove 触发其pre remove 并删除其日期。
从逻辑的角度来看,当删除目标中pre remove 钩子上的数据时,这也应该触发数据中的pre remove,因为删除了数据数据。为什么从另一个 pre remove 钩子中删除数据时不会触发它的 pre remove ?
从 Goal 中,我可以检索数据数组,但我不认为循环遍历数组并逐个删除日期是一个好习惯。
有没有办法触发从数据中的预删除,从目标的预删除?或者一种从数据数组中删除所有日期的方法?
ps:在未来,我想要在删除用户时再次做同样的事情(删除其所有目标,即删除所有数据和日期)。
编辑:
按照要求,他是我的目标,预移除钩子
GoalSchema.pre('remove', async function (next) {
try {
await DataModel.deleteMany({ 'ref_goal': this._id });
console.log("Data removed");
next();
} catch (err) {
console.log(err);
next(err);
}
});
我尝试了deleteMany、remove 等,但似乎都没有触发Data 预删除钩子
环境:
"express": "^4.17.1",
"mongoose": "^5.12.2",
【问题讨论】:
-
你能显示目标
pre remove钩子吗? -
@CuongLeNgoc 完成,我更新了我的问题
-
你使用的是哪个版本的猫鼬和快递?
-
并且还添加了日期数据和目标的模式/模型定义。为什么不在数据方案中将日期定义为嵌套模型。如图所示? mongoosejs.com/docs/subdocs.html
-
@Shasak 我是 react-native 的新手,我不知道嵌套模型。但是,如果我想删除一个用户,问题是一样的,我希望删除它的所有目标,以及目标的所有数据。在未来,我的shema会更复杂,我想了解为什么pre remove hook不会触发另一个schema pre remove hook
标签: javascript api express npm mongoose