我相对(阅读:非常)是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,以便我可以用它做什么?这似乎是某种范围问题,但对我来说没有意义。
非常感谢。
更新 我在下面用自己正确的方法来回答对象;但是如果有人能在这里解释变量范围,我仍然很感兴趣。这令人困惑。
答案 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
,但它不会以任何对我有意义的方式运行。 ..?