【问题标题】:Saving To MongoDB In A Loop循环保存到 MongoDB
【发布时间】:2015-03-17 05:04:07
【问题描述】:

我无法将新记录保存到 mongoDB。我很确定我在我的代码中使用了一些我不完全理解的东西,我希望有人能提供帮助。

我正在尝试为每只猫将新记录保存到 mongoDB。此代码适用于 node.js

for(var x = 0; x < (cats.length - 1); x++){
    if (!blocked){
      console.log("x = "+x);
      var memberMessage = new Message();
      memberMessage.message = message.message;
      memberMessage.recipient = room[x].userId;

      memberMessage.save(function(err){
        if (err) console.log(err);

        console.log(memberMessage + " saved for "+cats[x].name);
      });
    }
  });
}

我在循环之前记录了“cats”的值,我确实得到了我期望的所有名称,所以我认为循环遍历数组会为每个循环存储一条新记录。

似乎发生的事情是,当我查看数据库时,它似乎只保存了每个循环周期的最后一条记录。我不知道它是如何/为什么会这样做的。

感谢您对此提供任何帮助,因为我是 node.js 和 mongoDB 的新手。

谢谢。

【问题讨论】:

  • 使用 foreach ,这样可以正常工作

标签: javascript arrays node.js mongodb loops


【解决方案1】:

那是因为save 实际上是一个异步的 I/O 操作。现在,for 循环实际上是同步的。 可以这样想:你的 JS 引擎串行执行它看到的每一行。假设这些行一个接一个地保存在堆栈中。当涉及到save 时,它将它保留在不同的堆栈上(因为它是一个 I/O 操作,因此需要时间)并继续循环的其余部分。事实证明,引擎只会在完成旧堆栈的每一行后检查这个新堆栈。因此,变量cats 的值将是数组中的最后一项。因此,只保存最后一个值。

要对抗这场悲剧,你可以使用多种方法:

  1. 关闭 - Read More
  2. 承诺 - Read More。有一个 sweet library 承诺 mongo 驱动程序使其更易于使用。
  3. 发电机等 - Read More。尚未准备好迎接黄金时段。

关于 #2 的注意事项 - 我不是该项目的贡献者,但请与作者合作。我已经使用这个库一年多了,它又快又棒!

【讨论】:

    【解决方案2】:

    您可以使用 mongoose 的批量创建功能:

    var messages = [];
    for(var x = 0; x < (cats.length - 1); x++) {
        if (!blocked) {
           var message = new Message();
           message.message = message.message;
           message.recipient = room[x].userId;
           messages.push(message);
        } 
    }
    
    Message.create(messages, function (err) {
      if (err) // ...
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 2016-01-05
      • 2017-03-24
      • 2015-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多