我有一個CSV文件,我正在閱讀數百行。根據CSV文件中的一行,我創建一個'項目'並將其存儲到我的項目集合中。每個項目都有一個類別,這是它自己的模型。很多項目可以擁有相同的類別。兩個集合都沒有任何東西,我需要根據CSV文件填充這兩個集合。我遇到的問題是,由於許多行都包含相同的類別,通常會緊接着另一個類別,所以會創建同一類型的多個類別文檔,因爲一切都是異步發生的。我有這樣的代碼:異步節點,Mongoose插入數據
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。在那裏檢查類別是否已經存在。它可能會或可能不存在,具體取決於項目是否已保存。有兩種解決方案 1.通過保存後移動到下一個操作,使整個操作變慢。 2.一旦所有插入完成,請使用聚合。 – nightgaunt
@nightgaunt在轉移到下一個操作之前,我該如何等待某些東西來保存。我雖然節點是異步我不能這樣做?感謝任何建議將有所幫助。 – user3436082
遞歸!這是這種情況下的救星。讓我知道你是否想讓我在答案中寫入代碼塊。由於我不知道如何創建CsvFileReader,我會用一個簡單的循環來解釋它。 – nightgaunt