javascript - 循环保存到 MongoDB

标签 javascript arrays node.js mongodb loops

我在将新记录保存到 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 的新手。

谢谢。

最佳答案

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

为了对抗这场悲剧,您可以使用多种方法:

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

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

关于javascript - 循环保存到 MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28020439/

相关文章:

mysql - Node mysql 和 Promise

node.js - 收听 Firestore 中的实时更新,无需下载所有初始数据

javascript - 将 typescript 库捆绑到一个 .js 文件和一个 .d.ts

php - 在 mysql 中使用 php 数组查询

javascript - Javascript 中具有多个值的动态键值数组

javascript - 无法使用异步方法将数组传递给 View

c++ - CUDA:分配 1d 设备内存以将 2d 指针到指针主机数组复制到 GPU 或从 GPU 复制

node.js - NodeJS子进程信号处理

javascript - 类型错误 : Cannot read property 'then' of undefined at Object. Parse.File.save

javascript - jQuery Datepicker - 半天?