2017-09-29 6 views
1

こんにちは、私はノードに新しいです、そして、私はmongooseにデータを保存しようとしています。問題は、ユニット、ビルディング、セクションの3つのコレクションがあることです。 ビルのスキーマは次のとおりです。mongooseとasyncの滝モデルを使用してMongoDbにデータを保存する方法

var buildingsSchema=new Schema({ 
    buildingname:String, 
    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 
}); 

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

単位のスキーマですビルのIDと単位でイドの両方のビル&節

のは、今私がでJSONにアップロードされたExcelファイルを変換するxlsxプラグインを使用しているがあります: -

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

とマッピングするためにそれ私が

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

        } 

       }) 
      } 
     ]) 
    } 
} 
非同期滝モデルを使用していますJSONオブジェクトに変換し、保存0

は動作しますが、毎回mongodbのデータを検索するのではなく、毎回保存します。 重複は、mongodbのユニットを保存するための他の方法があれば、大きな問題になります。最初

+0

。 Buildings.findOne({buildingname:ele.building})ele.buildingは存在しませんあなたは未定義を検索しています。d.buildingを使用する必要があります –

+0

兄さんそれはちょうど問題です。データが繰り返し挿入され、私の実際のデータが入ります配列 –

+0

'for(var index = 1; ...)'の代わりに、 '' async.eachSeries() '](http://caolan.github.io/async/docs.html#eachSeries)を使用してください。 (または、おそらく 'async.eachLimit')。 – robertklep

答えて

0

私は建物やセクションを保存します:

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); 
       } 
       }) 
      } 
     }) 

その後、iを単位が保存されている:こんにちは、私はあなたの問題がこれだと思う

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) 
      }); 
関連する問題