【问题标题】:How to properly save array of objects with mongoose + nodejs?如何使用 mongoose + nodejs 正确保存对象数组?
【发布时间】:2012-09-17 09:39:30
【问题描述】:

我有一个名字数组:

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

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

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案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]);
    }
    

    【讨论】:

    • 这很好用,谢谢!但我想在 for 循环执行后,在同一个函数中执行 Person.find({}) 以获取插入后的所有文档。在执行 Person.find({}) 之前,如何确保循环完成?
    • @Damascusi 最好将其作为一个单独的问题发布,因为它很重要。先做一些搜索,因为这是常见的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2017-04-04
    • 2018-06-22
    • 2019-03-05
    • 1970-01-01
    • 2020-10-22
    相关资源
    最近更新 更多