Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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/Node.JS:在循环中插入文档-变量不更新?_Javascript_Node.js_Mongodb - Fatal编程技术网

Javascript MongoDB/Node.JS:在循环中插入文档-变量不更新?

Javascript MongoDB/Node.JS:在循环中插入文档-变量不更新?,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我对MongoDB相对来说(阅读:非常)陌生,遇到了一些让我困惑的事情 我有一个Employee对象数组,每个对象基本上如下所示: { "Name" : "Jack Jackson", "Title" : "Senior Derp Engineer", "Specialties" : [ "Kicking", "Screaming", "Throwing Tantrums" ] } …我想把它们作为文档插入我的收藏 这是代码(简化): var colle

我对MongoDB相对来说(阅读:非常)陌生,遇到了一些让我困惑的事情

我有一个Employee对象数组,每个对象基本上如下所示:

{
  "Name" : "Jack Jackson",
  "Title" : "Senior Derp Engineer",
  "Specialties" : [
    "Kicking",
    "Screaming",
    "Throwing Tantrums"
  ]
}
…我想把它们作为文档插入我的收藏

这是代码(简化):

var collection=db.collection('Employees');

对于(var ix=0;ix我想出了如何获取对象:

var collection = db.collection('Employees');
for (var ix=0; ix<allEntries.length; ix++) {
  var item = allEntries[ix];
  collection.insert(item, function(err, docs) {
    if (err) { MyErrorCallback(err); }
    else {
      // Insert specialties
      var insertedItem = docs["ops"][0];
      console.log(insertedItem["_id"] + ": " + insertedItem["Specialties"].length + " specialties.");
      // ...Code goes here which will insert a document into another collection associating the item's ObjectID with each specialty in the list.
    }
  });
}
var collection=db.collection('Employees');
对于(变量ix=0;ix)


但是,我确实不理解作用域在这里的工作方式,因为函数传递到collection.insert()中,它可以访问
,但它的行为对我来说毫无意义…?

我知道了如何获取对象:

var collection = db.collection('Employees');
for (var ix=0; ix<allEntries.length; ix++) {
  var item = allEntries[ix];
  collection.insert(item, function(err, docs) {
    if (err) { MyErrorCallback(err); }
    else {
      // Insert specialties
      var insertedItem = docs["ops"][0];
      console.log(insertedItem["_id"] + ": " + insertedItem["Specialties"].length + " specialties.");
      // ...Code goes here which will insert a document into another collection associating the item's ObjectID with each specialty in the list.
    }
  });
}
var collection=db.collection('Employees');
对于(变量ix=0;ix)


但是,我确实不理解作用域在这里的工作方式,因为函数传递到collection.insert()中有权访问
项,但它的行为对我来说没有任何意义…?

插入回调函数中的docs变量包含新插入的项及其objectID,因此只需对其执行所需操作即可


请尝试回调中的console.log(docs)以查看发生了什么。

插入回调函数中的docs变量包含新插入的项及其objectID,因此只需对其执行所需操作即可


尝试回调中的console.log(docs)来查看发生了什么。

这就是Node.js的工作方式,我花了太多时间来了解在像您这样的情况下发生了什么。Node.js希望无阻塞,这意味着此代码是异步运行的

例如:

for循环运行并将项设置为例如“1”。现在它调用mongoDB函数。到目前为止一切正常。问题是:Node.js不会等待继续for循环直到调用回调函数。for循环将继续。这意味着,该项将获得值,例如“2”现在,当调用回调时,for循环将结束。每个函数都将记录:“2”,因为这是变量的实际值


如果您在回调函数中打印出i的值,您可以看到一个示例。

这就是Node.js的工作方式,我花了太多时间来理解在您这样的情况下发生的事情。Node.js希望无阻塞,这意味着此代码是异步运行的

例如:

for循环运行并将项设置为例如“1”。现在它调用mongoDB函数。到目前为止一切正常。问题是:Node.js不会等待继续for循环直到调用回调函数。for循环将继续。这意味着,该项将获得值,例如“2”现在,当调用回调时,for循环将结束。每个函数都将记录:“2”,因为这是变量的实际值


如果您在回调函数中打印出i的值,您可以看到一个示例。

回调函数没有对项的访问权限,但它有第二个参数“docs”包含插入的一个或多个结果。这是回调的概念,当您结束I/O数据库工作时,请用结果调用我。当插入语句成功完成或出现错误时,mongoose将启动回调。您可以将此参数命名为“docs”的任意项。例如结果、结果或项。回调函数无权访问项,但它有第二个参数“docs”包含插入的一个或多个结果。这是回调的概念,当您结束I/O数据库工作时,请用结果调用我。当插入语句成功完成或出现错误时,mongoose将启动回调。您可以将此参数命名为“docs”的任意项。例如结果、结果或项目。此说明非常有用。谢谢!此说明非常有用。谢谢!