2012-09-25 100 views
0

我有名字的數組:如何正確保存與貓鼬+ nodejs對象的數組?

變種名稱=「凱利」,「艾米」,「標記」]

假設人只是爲了一個的NodeJS貓鼬模型......我要保存的每個名稱作爲文檔到MongoDB的下列要求:

for(var i = 0; i < names.length; i++) { 
      name_now = names[i]; 
     Person.findOne({ name: name_now}, 
      function(err, doc) { 
       if(!err && !doc) { 
        var personDoc = new PersonDoc(); 
        personDoc.name = name_now; 
        console.log(personDoc.name); 
        personDoc.save(function(err) {}); 
       } else if(!err) { 
        console.log("Person is in the system"); 
       } else { 
        console.log("ERROR: " + err); 
       } 
      } 
     ) 
} 

我有問題,我保持歌廳一個「錯誤創建時間表:MongoError:E11000重複鍵錯誤指數:..... DUP鍵:{」標記」}」。而且它似乎試圖將「標記」(列表中的最後一個元素)插入3次,而不是列表中的每個名稱。

當我嘗試打印出當前人在循環中的名稱(使用console.log(personDoc.name);)時,我得到了「標記」3次......並且它似乎只保存了數據庫中的「標記」,沒有其他人......處理這個問題的正確方法是什麼?

回答

1

findOne回調期間,name_now將始終設置爲names中的姓氏,因爲在第一個回調被調用之前for循環完成。您需要創建一個即時函數,以在每次迭代過程中捕獲當前的值name_now並將其保留用於回調中:

for(var i = 0; i < names.length; i++) { 
    (function (name_now) { 
     Person.findOne({ name: name_now}, 
      function(err, doc) { 
       if(!err && !doc) { 
        var personDoc = new PersonDoc(); 
        personDoc.name = name_now; 
        console.log(personDoc.name); 
        personDoc.save(function(err) {}); 
       } else if(!err) { 
        console.log("Person is in the system"); 
       } else { 
        console.log("ERROR: " + err); 
       } 
      } 
     ); 
    )(names[i]); 
} 
+0

這很好,謝謝!但是我想在執行for循環之後,在同一個函數內做一個Person.find({})來獲取插入後的所有文檔。在執行Person.find({})之前,如何確保循環完成? – Rolando

+0

@Damascusi最好作爲一個單獨的問題發佈,因爲它是不平凡的。首先進行一些搜索,因爲這是常見的情況。 – JohnnyHK