首页 文章

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

提问于
浏览
0

我有一系列名字:

var names = [“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重复键错误索引:..... dup key:{:”Mark“}” . 它似乎试图插入“Mark”(列表中的最后一个元素)3次,而不是列表中的每个名称 .

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

1 回答

  • 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]);
    }
    

相关问题