2012-09-25 53 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