[英]MongoDB / Node.JS: Inserting documents in a loop - variables not updating?
我對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),以便可以處理? 這似乎是某種范圍界定問題,但對我而言卻沒有任何意義。
非常感謝。
更新:我在下面用正確的方法自我解答了找回對象的方法。 但是我仍然很感興趣是否有人可以在這里解釋變量范圍。 令人困惑。
這就是Node.js的工作方式,我花了很多時間來了解像您這樣的情況下正在發生的事情。 Node.js希望是非阻塞的,這意味着該代碼是異步運行的。
舉個例子:
您的for循環運行並將項目設置為“ 1”。 現在,它調用mongoDB函數。 到目前為止一切都很好。 問題是:在調用回調函數之前,Node.js不會等待繼續for循環。 for循環將繼續。 這意味着該項目現在將獲得值,例如“ 2”。 調用回調時,for循環將結束。 每個函數都會記錄:“ 2”,因為這是變量的實際值。
如果您在回調函數中打印出i的值,則可以看到一個示例。
您在insert回調函數中的docs變量包含帶有其objectID的新插入項,因此只需對其進行操作即可。
嘗試在回調內的console.log(docs)看看發生了什么。
我想出了如何獲取對象:
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”項目的信息,請點擊此處 )。
但是,我絕對不了解作用域在這里的工作方式,因為傳遞給collection.insert()的函數可以訪問item
,但是它對我來說沒有任何意義……?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.