===== ОБНОВЛЕНИЕ 3 (4 апреля 2019 г.) =========
Я использую "mongoose": "^ 5.4.20" (отрезано для проверки проблемывнизу)
Мне нужно выполнить предварительное сохранение вложенных дочерних элементов по очереди ПЕРЕД родительским элементом.Это мой вариант использования:
bank // parent
+---bank_account // 1st level child
| +----trans // 2nd level child
| +----trans
+---bank_account
+----trans
SCHEMAS
// 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
// sum all the accounts balance to have the total
bank.schema.pre('save'. function(next)
{
var self = this;
self.total = 0;
// calculate total iterating among all the accounts
for(let a in self.accounts)
{
self.total += self.accounts[a].balance;
}
return next();
})
//Bank Account
// calculate the balance considering the transfers
bank_account.pre('save'. function(next)
{
var self = this;
self.balance = 0;
// calculate balance iterating among transfers
for(let t in self.transfers)
{
var trans = self.transfers[t].balance;
if(trans.type == "credit")
{ self.balance += trans.amount; }
else // debit
{ self.balance -= trans.amount;}
}
return next();
})
Когда я делаю
bank.accounts[x].transfers.push(trans);
bank.save();
Я ожидаючто после .save()
, bank.total
будет иметь правильную сумму, учитывая также новый перевод, который я только что добавил.НО это не тот случай ... как я мог заставить это работать?Очень грязное решение может быть выполнено bank.save()
2 раза, но это очень грязное решение ..
Документация v.5.4.21 говорит, что:
Поддокументы 'pre (' save ') и pre (' validate ') промежуточного программного обеспечения выполняются до pre (' save ') документа верхнего уровня, но после промежуточного программного обеспечения pre (' validate ') документа верхнего уровня.Это потому, что проверка перед save () на самом деле является частью встроенного промежуточного программного обеспечения.
Но это реально только тогда, когда есть только дети 1-го уровня.В моем случае у меня есть вложенные дочерние элементы, и правильный порядок сохраняется только среди родительских и (любого уровня) дочерних элементов ... как если бы весь уровень был сведен.
Я сделал надрезом REPL , который показывает проблему