Mongoose嵌套子/子文档预保存钩子顺序错误
====更新3(2019年4月4日)========= 我正在使用“猫鼬”:“^5.4.20”(剪下以测试底部的问题) 我需要在父元素的预保存之前依次执行嵌套子元素的预保存。 这是我的用例:Mongoose嵌套子/子文档预保存钩子顺序错误,mongoose,mongoose-schema,Mongoose,Mongoose Schema,====更新3(2019年4月4日)========= 我正在使用“猫鼬”:“^5.4.20”(剪下以测试底部的问题) 我需要在父元素的预保存之前依次执行嵌套子元素的预保存。 这是我的用例: bank // parent +---bank_account // 1st level child | +----trans // 2nd level child |
bank // parent
+---bank_account // 1st level child
| +----trans // 2nd level child
| +----trans
+---bank_account
+----trans
模式
// a bank have multiple accounts, total has the total amount of money available in the whole bank
bank : {
total : {type:Number},
accounts : [ {type : bank_account} ]
}
// a bank account has a balance calculated with all its transfers
bank_account: {
balance : {type:Number},
transfers : [ {type:trans} ]
}
trans: {
amount : {type:Number}, // always positive
type : {type:String, enum:["credit", "debit"]}
}
钩子
当我这样做的时候
bank.accounts[x].transfers.push(trans);
bank.save();
我希望在.save()
之后,bank.total
会有正确的总数,同时考虑到我刚刚添加的新转账。但事实并非如此。。。我怎样才能让它工作?非常脏的解决方案可以执行bank.save()
2次,但这是一个非常脏的解决方案
v.5.4.21规定:
执行子文档“预('save')和预('validate')中间件
在顶级文档的pre('save')之前,但在顶级文档之后
文档的预(“验证”)中间件。这是因为
save()实际上是一个内置中间件
但只有当只有一级孩子的时候才是真的。在我的例子中,我有嵌套的子级,正确的顺序只在父级和(任何级别)子级之间保持。。。好像所有的水平面都会被夷为平地
我做了一个剪贴,显示了问题所在
bank.accounts[x].transfers.push(trans);
bank.save();