如何使用猫鼬和异步瀑布模型将数据存储在MongoDb中 [英] How to store data in MongoDb using mongoose and async waterfall model

查看:101
本文介绍了如何使用猫鼬和异步瀑布模型将数据存储在MongoDb中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,我是node的新手,我正在尝试将数据保存在猫鼬中.问题是有3个集合单元,建筑物和部分. 建筑物的架构为:

Hello i am new to node and i am trying to save data in mongoose. The problem is that there are 3 collections Units, Building and Section. The Schema of Building is :

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

部分中,有一个建筑物 ID ,在单元中,有建筑物和一个建筑物的 ID.部分

in Section there is an Id of Building and in Units there is Id's of both Building & Section

现在我已经使用 xlsx 插件通过以下方式将上传的excel文件转换为json:-

now i have used xlsx plugin to convert uploaded excel file to json by :-

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

并将其映射到json对象并保存,我正在使用异步瀑布模型

and to map it into json object and saving i am using Async Waterfall Model

        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中搜索数据. 重复是主要问题,如果在mongodb中保存单位有任何其他方法对我有很大帮助.

its working but every time instead of searching of data in mongodb it save everytime. Duplication is the main problem if any other way to save units in mongodb will help me a lot.

推荐答案

首先,我保存了建筑物和部分:

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

这篇关于如何使用猫鼬和异步瀑布模型将数据存储在MongoDb中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆