Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在循环中保存到MongoDB_Javascript_Arrays_Node.js_Mongodb_Loops - Fatal编程技术网

Javascript 在循环中保存到MongoDB

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

我无法将新记录保存到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);
      });
    }
  });
}
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,这将很好使用