【问题标题】:Asynchronous Node, Mongoose Inserting in Data异步节点,Mongoose 插入数据
【发布时间】:2014-04-25 04:28:22
【问题描述】:

我有一个包含数百行的 CSV 文件。基于 CSV 文件中的一行,我正在创建一个“项目”并将其存储到我的项目集合中。每个项目也有一个类别,它是它自己的模型。这么多项目可以有相同的类别。这两个集合都一无所有,我需要根据 CSV 文件填充这两个集合。我遇到的问题是,由于许多行包含相同的类别,通常一个接一个地创建相同类型的多个类别文档,因为一切都是异步发生的。我有这样的代码:

    exports.upload = function(req, res) {
var reader = csv.createCsvFileReader("test.csv", {columnsFromHeader:true, nestedQuotes:true});
reader.addListener('data', function(data) {        
    projectService.findCategory(data.Category, function(id){
        var Project = mongoose.model('Project');
        var project = new Project();
        project.name = data.Name;
        project.narrative = data.Narrative;
        project.address = data.address;
        project.category = id;
        project.lat = data.Lat;
        project.lng = data.Lng;
        project.save(function(err){
            console.log(project);
            if(err){
                console.log("There was an error in saving your project");
                console.log(err);
                return;
            }
        });
    });
});

}

    exports.findCategory = function(projectCategory, callback) {
var Category = mongoose.model('Category');
Category.findOne({ name: projectCategory }, function(err, categoryReturned){
    if (err) {
        console.log("Could not return a category");
        console.log(err);
        return;
    }
    if(categoryReturned == null){ //If category does not exist create a new category. 
        category = new Category({name : projectCategory});
        console.log(category);
        category.save(function(err, categoryCreated){
            console.log('New Category Created');
            callback(categoryCreated._id);
        });
    }else{
        callback(categoryReturned._id);
    }
});

}

这是一些示例输入:

    "Name","Narrative","Address","Category","Lat","Lng","Year_Completed","Sponsors"
    "Raymond Avenue Neighborhood Garden Construction","","","3",34.0317141377768,-118.297777175903,"2010","??? (City of Los Angeles, The Garden Council)"
    "El Cariso Smart Garden Construction","","","3",34.3169450092985,-118.419291973114,"2010","L.A. County Parks and Recreation"
    "Central Basin Friendly Native Plants Garden","","","2",33.9955722580013,-118.144440650939,"2010","Central Basin Municipal Water District"

这将创建两个“3”类别条目。我知道为什么。我不知道如何绕过它。

【问题讨论】:

  • 在保存项目之前,您的代码会移动到下一次迭代或 CSV 的下一行。在那里你检查类别是否已经存在。它可能存在也可能不存在,具体取决于项目是否已保存。有2个解决办法 1. 保存后进入下一个操作,让整个操作变慢。 2. 完成所有插入后使用聚合。
  • @nightgaunt 在进行下一个操作之前,我如何等待保存某些内容。我虽然因为节点是异步的,所以我不能这样做??谢谢任何建议都会有所帮助。
  • 递归!!这就是这种情况下的救星。如果您希望我在答案中编写代码块,请告诉我。由于不知道createCsvFileReader是怎么做的,我就用一个简单的循环来解释一下吧。

标签: javascript node.js asynchronous mongoose


【解决方案1】:
var dataArray = new Array(YOUR DATA);
var index = 0;
(function(data) {
    var presentFunction = argument.callee;
    projectService.findCategory(data.Category, function(id){
        var Project = mongoose.model('Project');
        var project = new Project();
        project.name = data.Name;
        project.narrative = data.Narrative;
        project.address = data.address;
        project.category = id;
        project.lat = data.Lat;
        project.lng = data.Lng;
        project.save(function(err){
           console.log(project);
           if(err){
               console.log("There was an error in saving your project");
            console.log(err);
            return;
           }
           if (index > dataArray.length - 1) {
               return;
           } else {
               index++;
               presentFunction(dataArray[index]);
           }
        });
    });
})(dataArray[index]);

应该这样做。解决方案很粗糙,还有很大的改进空间,但你明白了。

【讨论】:

  • 感谢您的帮助! @nightgaunt
猜你喜欢
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多