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

时间:2015-08-14 19:42:42

标签: javascript node.js mongodb

我相对(阅读:非常)是MongoDB的新手,我遇到了令我困惑的事情。

我有一个Employee对象数组,每个对象看起来基本上都是这样的:

{
  "Name" : "Jack Jackson",
  "Title" : "Senior Derp Engineer",
  "Specialties" : [
    "Kicking",
    "Screaming",
    "Throwing Tantrums"
  ]
}

...我想将它们作为文档插入我的收藏中。

这是代码(简化):

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
      console.log(item["_id"] + ": " + item["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.
    }
  });
}

我希望对于100名员工的列表,我的控制台输出将包含allEntries中100个项目中每个项目的新创建的ObjectID,以及该项目中的专业数量。相反,我得到的是插入的第一个项目的ObjectID,以及插入的第一个项目的Specialties计数,重复100次。

这是为什么?如何访问刚刚插入的项目,包括新生成的ID,以便我可以用它做什么?这似乎是某种范围问题,但对我来说没有意义。

非常感谢。

更新 我在下面用自己正确的方法来回答对象;但是如果有人能在这里解释变量范围,我仍然很感兴趣。这令人困惑。

2 个答案:

答案 0 :(得分:3)

这就是Node.js的工作方式,我花了很多时间来了解像你这样的情况发生了什么。 Node.js想要非阻塞,这意味着这段代码是异步运行的。

举个例子:

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

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

答案 1 :(得分:0)

我想出了如何获取对象:

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.
    }
  });
}

(关于“ops”项目here的信息)。

但是,我绝对不明白范围在这里工作的方式,因为传递给collection.insert()的函数可以访问item,但它不会以任何对我有意义的方式运行。 ..?