如何使用mongoose和asynchronous瀑布模型在MongoDb中存储数据

你好我是新的节点,我想保存数据在mongoose。 问题是有3个collections单位,build筑和部分。 build筑图是:

var buildingsSchema=new Schema({ buildingname:String, status:String }); 

部分模式是:

 var sectionsSchema=new Schema({ section_type:String, buildings:{ type: Schema.Types.ObjectId, ref: 'buildings' }, status:String }); 

单位的架构是:

 var unitsSchema=new Schema({ unit_type:String, unit_num:String, unit_ac_num:Number, buildings:{ type: Schema.Types.ObjectId, ref: 'buildings' }, sections:{ type: Schema.Types.ObjectId, ref: 'sections' }, shares:Number }); 

部分有一个build筑物身份证和在单位有build筑物和部分的身份证

现在我已经使用xlsx插件将上传的Excel文件转换为json:

  var wb = XLSX.readFile("uploads/xls/" + req.file.filename); data = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]], {header:1}); 

并将其映射到json对象,并保存我使用asynchronous瀑布模型

  for (var index = 1; index < data.length - 1 ; index++) { var ele= data[index]; // console.log(ele); var d = { // this is an object which will hold data record_id: ele[0], residenceone_unit_id : ele[1], official_unit_id: ele[2], building: ele[3], unit_type : ele[4], section: ele[5], shares: ele[6], unit_style : ele[7] } // console.log(d); var unt = new Units(); // to save units unt = { unit_type: d.unit_type, unit_num: d.residenceone_unit_id, unit_ac_num: d.official_unit_id, buildings: '', // empty because need to put id of that particular building sections: '', // empty because need to put id of that particular sections shares:d.shares } async.waterfall([ function (callback) { // find building first Buildings.findOne({buildingname : ele.building}) .exec(function (err,doc) { if (err) { return callback(err); } // if no building then save one else if (!doc) { // console.log("Building is going to save") var build = new Buildings(); build.buildingname = d.building; build.status = "active"; build.save(function (err,dc) { if (err) { return callback(err); } else { // assign id of building to unit unt.buildings = dc._id ; callback(null); } }) } else { // if building is there then no need to save assign id of it to units // console.log("Building already exists;") unt.buildings = doc._id ; // execute second function callback(null); } // callback(null); }) }, function (callback) { // same as building find section of that building first with building Id and section type Sections.findOne({buildings : unt.buildings,section_type: d.section}) .exec(function (err,doc) { if (err) { return callback(err); } if (!doc) { // if no section of that building is there then save one // console.log("Section needs to be save") var sect = new Sections(); sect.section_type = d.section; sect.buildings = unt.buildings; sect.status = "active"; sect.save(function (err,dc) { if (err) { return callback(err); } else { // assign its id to unit // console.log("Section is saved") unt.sections = dc._id; // execute third function callback(null); } }) } else { // if there is section of that building id is available than assign id to units // console.log("Section already exists"); unt.sections = doc._id; // execute third function callback(null); } }) }, function (callback) { // there is no need to seaarch just need to save unit // console.log("Units is going to save") // console.log(unt); unt.save(function (err, doc) { if (err) { } else if (doc){ // console.log("Unit Saved"); // console.log(doc); } }) } ]) } } 

它的工作,但每一次,而不是在MongoDB中search数据,它每次保存。 复制是主要的问题,如果任何其他方式来保存mongodb单位将帮助我很多。

首先我保存build筑物和部分

 async.every(uniqueSection,function (uS,callback) { if (uS != undefined) { console.log(uS); Buildings.findOne({buildingname:uS.building}, function (err,doc) { if (doc) { // console.log(doc); Sections.findOne({buildings:doc._id,section_type:uS.section},function (er,sd) { if (sd) { // then dont save console.log(sd); } if (er) { console.log(er); } if (!sd) { // then save var sect = new Sections(); sect.buildings = doc._id; sect.section_type = uS.section; sect.status = 'active'; sect.save(function (err,st) { if(err) console.log(err); console.log(st); }) } }) } if (!doc) { if (uS.building != undefined) { var building = new Buildings(); building.buildingname = uS.building; building.status = "active"; building.save(function (er,dc) { if (dc) { // console.log(dc); Sections.findOne({buildings:dc._id,section_type:uS.section},function (er,sd) { if (sd) { // then dont save console.log(sd); } if (er) { console.log(er); } if (!sd) { // then save var sect = new Sections(); sect.buildings = dc._id; sect.section_type = uS.section; sect.status = 'active'; sect.save(function (err,st) { if(err) console.log(err); console.log(st); }) } }) } if (er) { console.log(er); } }) } } if (err) { console.log(err); } }) } }) 

那么我已经通过

  async.waterfall([ function(callback) { Buildings.findOne({buildingname:d.building}, function (err,doc) { if (doc) { buildingId = doc._id; callback(null, doc); } if (err) { console.log(err); } }) }, function(doc,callback) { Sections.findOne({buildings: buildingId,section_type:d.section},function (er,sd) { if (sd) { sectionId = sd._id; callback(null,doc,sd); } if (er) { console.log(er); } }) }, function (bld,st,callback) { var s = d.shares.replace(",",""); var unit = { unit_type: d.unit_type, unit_num: d.residenceone_unit_id, unit_ac_num: d.official_unit_id, buildings: bld._id, sections: st._id, shares: s } Units.findOne(unit,function (err,unt) { if (err) { console.log(err); } if(unt) { console.log(unt) } if (!unt) { var units = new Units(); units.unit_type = d.unit_type; units.unit_num = d.residenceone_unit_id; units.unit_ac_num = d.official_unit_id; units.buildings = bld._id; units.sections = st._id; units.shares = s; units.save(function (er,doc) { if (er) console.log(er); console.log(doc); }) } }) } ], function(err) { console.log(err) });