Mongoose嵌套子/子文档预保存钩子顺序错误

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 |

====更新3(2019年4月4日)=========

我正在使用“猫鼬”:“^5.4.20”(剪下以测试底部的问题)

我需要在父元素的预保存之前依次执行嵌套子元素的预保存。 这是我的用例:

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();