Предварительное сохранение вложенного вложенного / дочернего документа Mongoose - PullRequest
1 голос
/ 03 апреля 2019

===== ОБНОВЛЕНИЕ 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 , который показывает проблему

...