Javascript 在循环中保存到MongoDB
我无法将新记录保存到mongoDB。我很确定我在代码中使用了一些我不完全理解的东西,我希望有人能帮助我 我正试图为每只猫为mongoDB保存一张新记录。这段代码是针对node.js的Javascript 在循环中保存到MongoDB,javascript,arrays,node.js,mongodb,loops,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.me
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);
});
}
});
}
for(变量x=0;x<(cats.length-1);x++){
如果(!阻塞){
console.log(“x=”+x);
var memberMessage=新消息();
memberMessage.message=message.message;
memberMessage.recipient=文件室[x]。用户ID;
memberMessage.save(函数(错误){
if(err)console.log(err);
console.log(memberMessage+“为”+cats[x].name保存);
});
}
});
}
我在循环之前记录了“cats”的值,我得到了我期望的所有名称,因此我认为在数组中循环会为每个循环存储一条新记录
当我查看数据库时,似乎只保存了每个循环周期的最后一条记录。我不知道它会怎样/为什么那样做
我对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) // ...
});
var消息=[];
对于(变量x=0;x<(cats.length-1);x++){
如果(!阻塞){
var message=新消息();
message.message=message.message;
message.recipient=room[x].userId;
消息。推送(消息);
}
}
Message.create(消息、函数(err){
如果(错误)/。。。
});
您可以使用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) // ...
});
var消息=[];
对于(变量x=0;x<(cats.length-1);x++){
如果(!阻塞){
var message=新消息();
message.message=message.message;
message.recipient=room[x].userId;
消息。推送(消息);
}
}
Message.create(消息、函数(err){
如果(错误)/。。。
});
这是因为保存实际上是一个异步的I/O操作。现在,for
的循环实际上是同步的。
可以这样想:JS引擎连续执行它看到的每一行。假设这些行在堆栈上一个接一个地保留。当涉及到保存时
,它将它放在另一个堆栈上(因为这是一个I/O操作,因此需要时间),然后继续循环的其余部分。结果表明,引擎只有在完成旧堆栈上的每一行之后才会检查新堆栈。因此,变量cats
的值将是数组中的最后一项。因此,只保存最后一个值
为了应对这场悲剧,您可以使用多种方法:
封闭-
- 您可以按如下方式关闭:
承诺-。有一种方法可以使mongo驱动程序更易于使用
发电机等。还没有为黄金时间做好准备
关于#2的说明-我不是该项目的贡献者,但与作者合作。我已经使用这个图书馆一年多了,而且它速度快而且棒极了 这是因为save
实际上是一个异步的I/O操作。现在,for
的循环实际上是同步的。
可以这样想:JS引擎连续执行它看到的每一行。假设这些行在堆栈上一个接一个地保留。当涉及到保存时
,它将它放在另一个堆栈上(因为这是一个I/O操作,因此需要时间),然后继续循环的其余部分。结果表明,引擎只有在完成旧堆栈上的每一行之后才会检查新堆栈。因此,变量cats
的值将是数组中的最后一项。因此,只保存最后一个值
为了应对这场悲剧,您可以使用多种方法:
封闭-
- 您可以按如下方式关闭:
承诺-。有一种方法可以使mongo驱动程序更易于使用
发电机等。还没有为黄金时间做好准备
关于#2的说明-我不是该项目的贡献者,但与作者合作。我已经使用这个图书馆一年多了,而且它速度快而且棒极了 使用foreach,这将很好使用foreach,这将很好使用