保存后猫鼬更新

Posted

技术标签:

【中文标题】保存后猫鼬更新【英文标题】:Mongoose update after save 【发布时间】:2015-04-10 04:16:24 【问题描述】:

我错过了一些关于 Mongoose 保存功能的回调。 我正在尝试插入新交易,如果成功,请更新用户帐户。我相信这个问题,这会导致所有人都被最后一个人的金额更新。我想要做的是在保存另一个文档后更新一个文档。

这里是代码。请让我知道我做错了什么。 提前致谢。

//find all schedules
SchedModel.find( Day_Of_Week: day , null, null, function (err, Sched) 
   if (!err) 
      //iterate through what we find
      for (var key in Sched) 
         if (Sched.hasOwnProperty(key)) 
            var val = Sched[key];
            console.log("val : " + val);
            var Sched_Descr = day || ' Sched Trans';  
            var this_trans = new TransModel(
                         mID: val.K_Id,
                         mDate: today,
                         mDescr: Sched_Descr,
                         mAmt: val.mAmt
             );
             //insert the new trans
             this_trans.save(function (err, trans) 
                if (!err) 
                   //when we insert new trans, get the update model
                   MyModel.findById(val.K_Id, function (err, Model) 
                      Model.Balance = Model.Balance + val.mAmt;
                      //save model, this update to the last in the list
                      Model.save(function (err) 
                         if (!err) 
                            console.log("updated");
                          else 
                            console.log(err);
                         
                      );
                   );              
                 else 
                   return console.log(err);
                
             );                           
          
       
     else 
       console.log(err);
    ;
 );

【问题讨论】:

你试过 findAndModify 吗?它可以帮助你 【参考方案1】:

更新:ES6 的let 非常简单地解决了这个问题,只需在原始代码中将var 替换为let,它应该可以工作。


您的 this_trans 和此类变量在 for-in 循环的每次迭代中都不是唯一的。您可能想将其包装在一个自动执行的匿名函数范围内 ((function())())

//find all schedules
SchedModel.find( Day_Of_Week: day , null, null, function (err, Sched) 
   if (!err) 
      //iterate through what we find
      for (var key in Sched) 
        (function(key)       // self-executing anonymous function scope
         if (Sched.hasOwnProperty(key)) 
            var val = Sched[key];
            console.log("val : " + val);
            var Sched_Descr = day || ' Sched Trans';  
            var this_trans = new TransModel(
                         mID: val.K_Id,
                         mDate: today,
                         mDescr: Sched_Descr,
                         mAmt: val.mAmt
             );
             //insert the new trans
             this_trans.save(function (err, trans) 
                if (!err) 
                   //when we insert new trans, get the update model
                   MyModel.findById(val.K_Id, function (err, Model) 
                      Model.Balance = Model.Balance + val.mAmt;
                      //save model, this update to the last in the list
                      Model.save(function (err) 
                         if (!err) 
                            console.log("updated");
                          else 
                            console.log(err);
                         
                      );
                   );              
                 else 
                   return console.log(err);
                
             );                           
          
        )(key);
      
     else 
       console.log(err);
    ;
 );

【讨论】:

以上是关于保存后猫鼬更新的主要内容,如果未能解决你的问题,请参考以下文章

创建使用猫鼬更新和保存文档的方法?

猫鼬中的保存功能不起作用

当我使用Model.findOneAndUpdate时,不会调用用于保存和更新的猫鼬预钩子

如何在猫鼬中保存子文档的数组?

在猫鼬中,如果我正在创建一个包含 4 个字段的模式。但我只保存两个字段的值。如何更新未给出的字段值?

使用猫鼬异步保存多个文档