循环保存到 MongoDB
Saving To MongoDB In A Loop
我无法将新记录保存到 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" 的值,我确实得到了我期望的所有名称,所以我认为循环遍历数组会为每个循环存储一条新记录。
似乎发生的事情是,当我查看数据库时,它似乎只保存了每个循环周期的最后一条记录。我不知道 how/why 它会那样做。
感谢任何帮助,因为我是 node.js 和 mongoDB 的新手。
谢谢。
您可以使用 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) // ...
});
那是因为 save
实际上是一个 I/O 操作,它是异步的。现在,for
循环实际上是同步的。
这样想:你的 JS 引擎串行执行它看到的每一行。假设这些行一个接一个地保存在堆栈中。当涉及到 save
时,它将它放在不同的堆栈上(因为它是一个 I/O 操作,因此会花费时间)并继续循环的其余部分。事实证明,引擎只会在完成旧堆栈的每一行后才检查这个新堆栈。因此,变量 cats
的值将是数组中的最后一项。因此,只有最后一个值被保存。
要解决这个悲剧,您可以使用多种方法:
- 闭包 - Read More
- 你可以这样关闭:
cats.forEach()
- Promises - Read More. There is a sweet library 承诺 mongo 驱动程序使其更易于使用。
- 发电机等 - Read More。尚未准备好进入黄金时段。
关于 #2 的注意事项 - 我不是该项目的贡献者,但与作者一起工作。我使用这个库已经一年多了,它又快又棒!
我无法将新记录保存到 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" 的值,我确实得到了我期望的所有名称,所以我认为循环遍历数组会为每个循环存储一条新记录。
似乎发生的事情是,当我查看数据库时,它似乎只保存了每个循环周期的最后一条记录。我不知道 how/why 它会那样做。
感谢任何帮助,因为我是 node.js 和 mongoDB 的新手。
谢谢。
您可以使用 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) // ...
});
那是因为 save
实际上是一个 I/O 操作,它是异步的。现在,for
循环实际上是同步的。
这样想:你的 JS 引擎串行执行它看到的每一行。假设这些行一个接一个地保存在堆栈中。当涉及到 save
时,它将它放在不同的堆栈上(因为它是一个 I/O 操作,因此会花费时间)并继续循环的其余部分。事实证明,引擎只会在完成旧堆栈的每一行后才检查这个新堆栈。因此,变量 cats
的值将是数组中的最后一项。因此,只有最后一个值被保存。
要解决这个悲剧,您可以使用多种方法:
- 闭包 - Read More
- 你可以这样关闭:
cats.forEach()
- 你可以这样关闭:
- Promises - Read More. There is a sweet library 承诺 mongo 驱动程序使其更易于使用。
- 发电机等 - Read More。尚未准备好进入黄金时段。
关于 #2 的注意事项 - 我不是该项目的贡献者,但与作者一起工作。我使用这个库已经一年多了,它又快又棒!