2014-03-19 45 views
0

我有一個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'類別條目。我知道爲什麼。我不知道如何繞過它。

+0

保存項目之前,您的代碼會移至下一次迭代或下一行CSV。在那裏檢查類別是否已經存在。它可能會或可能不存在,具體取決於項目是否已保存。有兩種解決方案 1.通過保存後移動到下一個操作,使整個操作變慢。 2.一旦所有插入完成,請使用聚合。 – nightgaunt

+0

@nightgaunt在轉移到下一個操作之前,我該如何等待某些東西來保存。我雖然節點是異步我不能這樣做?感謝任何建議將有所幫助。 – user3436082

+0

遞歸!這是這種情況下的救星。讓我知道你是否想讓我在答案中寫入代碼塊。由於我不知道如何創建CsvFileReader,我會用一個簡單的循環來解釋它。 – nightgaunt

回答

0
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]); 

這應該這樣做。解決方案很粗糙,有很大的改進空間,但你明白了。

+0

謝謝你真的幫助! @nightgaunt – user3436082

+0

如果這能解決您的問題,您可以將此答案標記爲正確 – nightgaunt