代码之家  ›  专栏  ›  技术社区  ›  Rolando

如何使用mongose+nodejs正确保存对象数组?

  •  0
  • Rolando  · 技术社区  · 13 年前

    我有一系列的名字:

    var name=[“Kelley”、“Amy”、“Mark”]

    假设Person只是nodejs的Mongoose模型。。。我想用以下内容将每个名称作为文档保存到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重复密钥错误索引:……重复密钥:{:“标记”}”时遇到了问题。它似乎试图插入“Mark”(列表中的最后一个元素)3次,而不是列表中的每个名称。

    当我试图打印出循环中当前人员的姓名时(使用console.log(personDoc.name);),我得到“马克”三次。。。而且它似乎只在数据库中保存了“Mark”,而没有其他人。。。处理这个问题的正确方法是什么?

    1 回复  |  直到 13 年前
        1
  •  1
  •   JohnnyHK    13 年前

    findOne 回调, name_now 总是设置为中的姓氏 names 因为 for 循环在调用第一个回调之前就完成了。您需要创建一个即时函数来捕获当前 名称(_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]);
    }
    
    推荐文章