簡體   English   中英

MongoDB / Node.JS:循環插入文檔-變量不更新?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM