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

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

现在我已经使用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对象并保存,我正在使用异步瀑布模型

        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中保存单位有任何其他方法可以帮助我,那么重复是主要问题。

最佳答案

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

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

关于json - 如何使用 Mongoose 和异步 waterfall 模型将数据存储在MongoDb中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46484088/

10-10 00:32
查看更多