nodejs+mongoose简单关联+增删改查

来源:互联网 发布:网络电影 罪 编辑:程序博客网 时间:2024/04/29 10:30

本篇文章是关于mongoose的简单操作,包括使用objectId来关联和一些增删查改的方法。希望能指出不正确的地方,因为我也是初学者。也希望能对其他初学者有帮助!谢谢!微笑微笑


node.js目录结构:

routes:路由分发

controller:mvc中C层,做逻辑处理

models:mvc中m层,数据表模型

DBsql:模型sql操作

DBhelper:公共sql方法


数据表结构

user:学生表

schoolClass:班级表

user_schoolClass:多对多中间表



逻辑过程:

(1)新建对应表模型及关联

(2)设计增删改查语句

(3)逻辑层使用模型去执行增删查改方法


(1)新建对应表模型及关联

user模型

var mongoose = require('mongoose');var Schema   = mongoose.Schema;//schema 就是如何定义数据的结构var userSchema = new mongoose.Schema({    userName:{type:String}});//生成方法getModel给予调用,返回user模型module.exports = {    getModel: function(){        return _getModel();    }};//通过db将表user和Schema结构连接在一起,没有表的话会自动产生。var _getModel = function(type,err){    var userModel = global.db.model('user',userSchema);    return userModel;};
schoolClass模型

var mongoose = require('mongoose');var Schema   = mongoose.Schema;var schoolClassSchema = new mongoose.Schema({    schoolClassName:{type:String}});module.exports = {    getModel: function(){        return _getModel();    }};var _getModel = function(){    var schoolClassModel = global.db.model('schoolClass',schoolClassSchema);    return schoolClassModel;};
user_schoolClass模型

var mongoose = require('mongoose');var Schema   = mongoose.Schema;var user_schoolClassSchema = new mongoose.Schema({    userId:{type: Schema.Types.ObjectId, ref: 'user' },//定义类型为objectid ,ref是关联的模型名称    schoolClassId:{type: Schema.Types.ObjectId, ref: 'schoolClass' }<span style="font-family: Arial, Helvetica, sans-serif;">//定义类型为objectid ,ref是关联的模型名称</span>});module.exports = {    getModel: function(){        return _getModel();    }};var _getModel = function(type,err){    var user_schoolClassModel = global.db.model('user_schoolClass',user_schoolClassSchema);    return user_schoolClassModel;};
(2)设计增删改查语句

dbHelper.js

/** * 公共Add方法 * @param model 要操作数据库的模型 * @param conditions 增加的条件,如{id:xxx} * @param callback 回调方法 */exports.addData =function(model,conditions,callback) {    model.create(conditions, function(err,result){        if(err) {            console.log(err);            callback({success:0,flag:"save data fail"});        } else {            console.log('save success');            callback({success:1,flag:"save data success"});        }    });}/** * 公共update方法 * @param model 要操作数据库的模型 * @param conditions 增加的条件,如{id:xxx} * @param update 更新条件{set{id:xxx}} * @param options  * @param callback */exports.updateData =function(model,conditions,update,options,callback) {    model.update(conditions, update, options, function(error,result){        if(error) {            console.log(error);            callback({success:0,flag:"update data fail"});        } else {            if(result.n!=0){                console.log('update success!');                callback({success:1,flag:"update data success"});            }            else{                console.log('update fail:no this data!');                callback({success:0, flag: 'update fail:no this data!'});            }        }    });}/** * 公共remove方法 * @param model * @param conditions * @param callback */exports.removeData =function(model,conditions,callback) {    model.remove(conditions, function(error,result) {        if (error) {            console.log(error);            callback({success: 0, flag: "remove data fail"});        } else {            if(result.result.n!=0){                console.log('remove success!');                callback({success: 1, flag: "remove data success"});            }            else{                console.log('remove fail:no this data!');                callback({success:0, flag: 'remove fail:no this data!'});            }        }    });}/** * 公共find方法 非关联查找 * @param model * @param conditions * @param fields 查找时限定的条件,如顺序,某些字段不查找等 * @param options * @param callback */exports.findData =function(model,conditions,fields,options,callback) {    model.find(conditions, fields, options, function(error, result){        if(error) {            console.log(error);            callback({success: 0, flag: "find data fail"});        } else {            if(result.length!=0){                console.log('find success!');                callback({success: 1, flag: "find data success",result:result});            }            else{                console.log('find fail:no this data!');                callback({success: 0, flag: 'find fail:no this data!'});            }        }    });}/** * 公共populate find方法 * 是关联查找 * @param model * @param conditions * @param path :The field need to be refilled (需要覆盖的字段) * @param fields :select fields (name -_id,Separated by a space field,In front of the field name plus "-"said not filled in) * @param refmodel (关联的字段,有path可为null) * @param options * @param callback */exports.findDataPopulation =function(model,conditions,path,fields,refmodel,options,callback) {    model.find(conditions)    .populate(path,fields, refmodel,options)    .exec(function(err, result) {            if(err) {                console.log(err);                callback({success: 0, flag: 'population find data fail'});            } else {                if(result.length!=0){                    console.log('population find success!');                    callback({success: 1, flag: 'population find data success',result:result});                }                else{                    console.log('population find fail:no this data!');                    callback({success: 0, flag: 'population find fail:no this data!'});                }            }    });}

userDao(schoolClassDao跟userDao一样,只是获取model是获取schoolClass的model就不贴出来了)

var user =require('../models/user');/** * 调用公共add方法并且传入操作数据库的模型user * @returns {Function} */exports.addUser = function(conditions,dbHelper,callback) {    //获取user模型    var userModel =user.getModel();    dbHelper.addData(userModel,conditions,function(result) {        callback(result);    });};/** * 调用公共find方法并且传入操作数据库的模型user * @param conditions * @param dbHelper * @param callback */exports.findUser = function(conditions,dbHelper,callback) {    var userModel =user.getModel();    var fields   = {};    var options  = {};    dbHelper.findData(userModel,conditions,fields,options,function(result){        callback(result);    });}/** * 调用公共remove方法并且传入操作数据库的模型user * @param conditions * @param dbHelper * @param callback */exports.removeUser = function(conditions,dbHelper,callback) {    var userModel =user.getModel();    dbHelper.removeData(userModel,conditions,function(result){        callback(result);    });}/** * 调用公共update方法并且传入操作数据库的模型user * @param conditions * @param update * @param options * @param dbHelper * @param callback */exports.updateUser = function(conditions,update,options,dbHelper,callback) {    var userModel =user.getModel();    dbHelper.updateData(userModel,conditions,update,options,function(result){        callback(result);    });}

user_schoolClassDao

var user_schoolClass =require('../models/user_schoolClass');var user = require('../models/user');var schoolClass = require('../models/schoolClass');/** * add User_schoolClass * @param conditions * @param dbHelper * @param callback */exports.addUser_schoolClass = function(conditions,dbHelper,callback) {    var user_schoolClassModel =user_schoolClass.getModel();    dbHelper.addData(user_schoolClassModel,conditions,function(result) {        callback(result);    });}/** * find User_SchoolClass 非Ref * @param conditions * @param dbHelper * @param callback */exports.findUser_schoolClass = function(conditions,dbHelper,callback) {    var user_schoolClassModel =user_schoolClass.getModel();    var conditions =conditions;    var fields   = {};    var options  = {};    dbHelper.findData(user_schoolClassModel,conditions,fields,options,function(result){        callback(result);    });}/** * find User_SchoolClass 是Ref * @param conditions * @param path         需要被填充的字段 * @param dbHelper * @param callback */exports.findUser_schoolClassRef = function(conditions,path,dbHelper,callback) {    var user_schoolClassModel =user_schoolClass.getModel();    var path = path;    var fields   = {__v:0};    var options  = {sort:{_id:1}};    var refmodel1 = schoolClass.getModel();    var refmodel2 = user.getModel();    dbHelper.findDataPopulation(user_schoolClassModel,conditions,path,fields,{},options,function(result){        callback(result);    });}/** * remove User_shcoolClass * @param conditions * @param dbHelper * @param callback */exports.removeUser_schoolClass = function(conditions,dbHelper,callback) {    var user_schoolClassModel =user_schoolClass.getModel();    dbHelper.removeData(user_schoolClassModel,conditions,function(result){        callback(result);    });}/** * update User_schoolClass * @param conditions * @param update * @param options * @param dbHelper * @param callback */exports.updateUser_schoolClass = function(conditions,update,options,dbHelper,callback) {    var user_schoolClassModel =user_schoolClass.getModel();    dbHelper.updateData(user_schoolClassModel,conditions,update,options,function(result){        callback(result);    });    }

findUser_schoolClass :不会找出user和schoolClass的实际内容

findUser_schoolClassRef :会找出user和schoolClass的实际内容


(3)逻辑层使用模型去执行增删查改方法

var dbHelper = require('../DBhelper/dbHelper');var userDao =require('../DBSql/userDao');/** * add user * @returns {Function} */exports.userAddAction = function() {    return function(req, res) {        var user = new Array();        for(var i=0;i<10;i++){            user.push({                _id   : new global.mongoose.Types.ObjectId(),                userName  : "user"+(i+1)//字段如果不是在model里面定义字段,则不会被录入            });        }        userDao.addUser(user,dbHelper,function(result){            res.json(result);        });    }}/** * get User List * @returns {Function} */exports.userFindAction = function() {    return function(req, res) {        var conditions ={};        userDao.findUser(conditions,dbHelper,function(result){            res.json(result);        });    }}exports.userRemoveAction = function() {    return function(req, res) {        var conditions ={};        userDao.removeUser(conditions,dbHelper,function(result){            res.json(result);        });        //除了要删除user表里的内容,还要删除关联表(user_schoolClass)的内容    }}exports.userUpdateAction = function() {    return function (req, res) {        var conditions = {};        var update = {}//{$set : {userName:xxx}};        var options = {}//{upsert:false};        userDao.updateUser(conditions, update, options, dbHelper, function (result) {            res.json(result);        });        //如果要更加关联对象,需要update user_schoolClass表中的userid 和scoolClassId    }}

schoolClassManagermentController跟userManagementController一样,只有add方法有改变

var schoolClassDao =require('../DBSql/schoolClassDao');var dbHelper = require('../DBhelper/dbHelper');/** * add schoolClass * @returns {Function} */exports.schoolClassAddAction = function() {    return function(req, res) {        var schoolClass =new Array();        //新建两个班级        for(var i=0;i<2;i++){            schoolClass.push({                _id   : new global.mongoose.Types.ObjectId(),                schoolClassName  : "class"+(i+1)            });        }        //调用Dao的add方法来使用user模型来增加        schoolClassDao.addSchoolClass(schoolClass,dbHelper,function(result){            res.json(result);        });    }}
①调用user的add方法,生成10个user。url:http://10.222.225.19:8080/userAddAction

②调用user的find方法查看。url:http://10.222.225.19:8080/userFindAction
{  "success": 1,  "flag": "find data success",  "result": [    {      "_id": "568c82c1cf41cfa50016830a",      "userName": "user1",      "__v": 0    },    {      "_id": "568c82c1cf41cfa50016830b",      "userName": "user2",      "__v": 0    },    {      "_id": "568c82c1cf41cfa50016830c",      "userName": "user3",      "__v": 0    },    {      "_id": "568c82c1cf41cfa50016830d",      "userName": "user4",      "__v": 0    },    {      "_id": "568c82c1cf41cfa50016830e",      "userName": "user5",      "__v": 0    },    {      "_id": "568c82c1cf41cfa50016830f",      "userName": "user6",      "__v": 0    },    {      "_id": "568c82c1cf41cfa500168310",      "userName": "user7",      "__v": 0    },    {      "_id": "568c82c1cf41cfa500168311",      "userName": "user8",      "__v": 0    },    {      "_id": "568c82c1cf41cfa500168312",      "userName": "user9",      "__v": 0    },    {      "_id": "568c82c1cf41cfa500168313",      "userName": "user10",      "__v": 0    }  ]}
③调用schoolClass的add方法,生成2个schoolClass。url:http://10.222.225.19:8080/schoolClassAddAction
④调用schoolClass的find方法查看。url:http://10.222.225.19:8080/schoolClassFindAction
{  "success": 1,  "flag": "find data success",  "result": [    {      "_id": "568c834c0de1c69ceb235edd",      "schoolClassName": "class1",      "__v": 0    },    {      "_id": "568c834c0de1c69ceb235ede",      "schoolClassName": "class2",      "__v": 0    }  ]}

user_schoolClassController除了add方法和find方法不一样,其余大致相同。

var schoolClassDao =require('../DBSql/schoolClassDao');var dbHelper = require('../DBhelper/dbHelper');var userDao =require('../DBSql/userDao');var user_schoolClassDao =require('../DBSql/user_schoolClassDao');/** * add user_schoolClass * @returns {Function} */exports.user_schoolClassAddAction = function() {    return function(req, res) {                var userId = new Array();        var schoolClassId = new Array();        //查找存在的所以user        userDao.findUser({},dbHelper,function(result){           if(result.success==1){               var user =result.result;                               //把每个user的id取出放进数组userId               for(var i=0;i<user.length;i++){                   userId[i]=user[i]._id;               }                              //以相同做法将schoolClass的id取出放在schoolClassId中               schoolClassDao.findSchoolClass({},dbHelper,function(result){                   if(result.success==1){                       var schoolClass =result.result;                       for(var i=0;i<schoolClass.length;i++){                           schoolClassId[i]=schoolClass[i]._id;                       }                                             var user_schoolClass = new Array();                       for(var i=0;i<schoolClassId.length;i++){                           //将前5个user与schoolclass1关联                           if(i==0){                               for(var j=0;j<5;j++){                                   user_schoolClass.push({                                       userId:userId[i],                                       schoolClassId:schoolClassId[i]                                   });                               }                           }                           else{                               //将后5个user与schoolclass2关联                               for(var j=5;j<10;j++){                                   user_schoolClass.push({                                       userId:userId[i],                                       schoolClassId:schoolClassId[i]                                   });                               }                           }                       }                                              //中间表将增加user与schoolclass关联                       user_schoolClassDao.addUser_schoolClass(user_schoolClass,dbHelper,function(result){                           res.json(result);                       });                   }               });           }        });    }}/** * 查找方法,不关联查找 * user_schoolClass find * @returns {Function} */exports.user_schoolClassFindAction = function() {    return function(req, res) {        var conditions ={};        user_schoolClassDao.findUser_schoolClass(conditions,dbHelper,function(result){            res.json(result);        });    }}/** * 关联查找 * user_schoolClass find Ref * @returns {Function} */exports.user_schoolClassFindRefAction = function() {    return function(req, res) {        var conditions ={};        //用空格隔开要被填充的字段        var path="userId schoolClassId"        user_schoolClassDao.findUser_schoolClassRef(conditions,path,dbHelper,function(result){            res.json(result);        });    }}

⑤调用user_schoolClass的add方法,生成2个schoolClass。url:http://10.222.225.19:8080/user_schoolClassAddAction
⑥调用user_schoolClass的不关联的find方法查看。http://10.222.225.19:8080/user_schoolClassFindAction
{  "success": 1,  "flag": "find data success",  "result": [    {      "_id": "568c85b19f4a4e210f07b126",      "userId": "568c82c1cf41cfa50016830a",      "schoolClassId": "568c834c0de1c69ceb235edd",      "__v": 0    },    {      "_id": "568c85b19f4a4e210f07b129",      "userId": "568c82c1cf41cfa50016830a",      "schoolClassId": "568c834c0de1c69ceb235edd",      "__v": 0    },    {      "_id": "568c85b19f4a4e210f07b12a",      "userId": "568c82c1cf41cfa50016830a",      "schoolClassId": "568c834c0de1c69ceb235edd",      "__v": 0    },    {      "_id": "568c85b19f4a4e210f07b128",      "userId": "568c82c1cf41cfa50016830a",      "schoolClassId": "568c834c0de1c69ceb235edd",      "__v": 0    },    {      "_id": "568c85b19f4a4e210f07b127",      "userId": "568c82c1cf41cfa50016830a",      "schoolClassId": "568c834c0de1c69ceb235edd",      "__v": 0    },    {      "_id": "568c85b19f4a4e210f07b12e",      "userId": "568c82c1cf41cfa50016830b",      "schoolClassId": "568c834c0de1c69ceb235ede",      "__v": 0    },    {      "_id": "568c85b19f4a4e210f07b12d",      "userId": "568c82c1cf41cfa50016830b",      "schoolClassId": "568c834c0de1c69ceb235ede",      "__v": 0    },    {      "_id": "568c85b19f4a4e210f07b12c",      "userId": "568c82c1cf41cfa50016830b",      "schoolClassId": "568c834c0de1c69ceb235ede",      "__v": 0    },    {      "_id": "568c85b19f4a4e210f07b12f",      "userId": "568c82c1cf41cfa50016830b",      "schoolClassId": "568c834c0de1c69ceb235ede",      "__v": 0    },    {      "_id": "568c85b19f4a4e210f07b12b",      "userId": "568c82c1cf41cfa50016830b",      "schoolClassId": "568c834c0de1c69ceb235ede",      "__v": 0    }  ]}
可以看出并没有显示user 和schoolClass相关数据,只显示了id;
⑦调用user_schoolClass的关联的find方法查看。http://10.222.225.19:8080/user_schoolClassFindRefAction
{  "success": 1,  "flag": "population find data success",  "result": [    {      "_id": "568c85b19f4a4e210f07b126",      "userId": {        "_id": "568c82c1cf41cfa50016830a",        "userName": "user1"      },      "schoolClassId": {        "_id": "568c834c0de1c69ceb235edd",        "schoolClassName": "class1"      },      "__v": 0    },    {      "_id": "568c85b19f4a4e210f07b129",      "userId": {        "_id": "568c82c1cf41cfa50016830a",        "userName": "user1"      },      "schoolClassId": {        "_id": "568c834c0de1c69ceb235edd",        "schoolClassName": "class1"      },      "__v": 0    },    {      "_id": "568c85b19f4a4e210f07b12a",      "userId": {        "_id": "568c82c1cf41cfa50016830a",        "userName": "user1"      },      "schoolClassId": {        "_id": "568c834c0de1c69ceb235edd",        "schoolClassName": "class1"      },      "__v": 0    },    {      "_id": "568c85b19f4a4e210f07b128",      "userId": {        "_id": "568c82c1cf41cfa50016830a",        "userName": "user1"      },      "schoolClassId": {        "_id": "568c834c0de1c69ceb235edd",        "schoolClassName": "class1"      },      "__v": 0    },    {      "_id": "568c85b19f4a4e210f07b127",      "userId": {        "_id": "568c82c1cf41cfa50016830a",        "userName": "user1"      },      "schoolClassId": {        "_id": "568c834c0de1c69ceb235edd",        "schoolClassName": "class1"      },      "__v": 0    },    {      "_id": "568c85b19f4a4e210f07b12e",      "userId": {        "_id": "568c82c1cf41cfa50016830b",        "userName": "user2"      },      "schoolClassId": {        "_id": "568c834c0de1c69ceb235ede",        "schoolClassName": "class2"      },      "__v": 0    },    {      "_id": "568c85b19f4a4e210f07b12d",      "userId": {        "_id": "568c82c1cf41cfa50016830b",        "userName": "user2"      },      "schoolClassId": {        "_id": "568c834c0de1c69ceb235ede",        "schoolClassName": "class2"      },      "__v": 0    },    {      "_id": "568c85b19f4a4e210f07b12c",      "userId": {        "_id": "568c82c1cf41cfa50016830b",        "userName": "user2"      },      "schoolClassId": {        "_id": "568c834c0de1c69ceb235ede",        "schoolClassName": "class2"      },      "__v": 0    },    {      "_id": "568c85b19f4a4e210f07b12f",      "userId": {        "_id": "568c82c1cf41cfa50016830b",        "userName": "user2"      },      "schoolClassId": {        "_id": "568c834c0de1c69ceb235ede",        "schoolClassName": "class2"      },      "__v": 0    },    {      "_id": "568c85b19f4a4e210f07b12b",      "userId": {        "_id": "568c82c1cf41cfa50016830b",        "userName": "user2"      },      "schoolClassId": {        "_id": "568c834c0de1c69ceb235ede",        "schoolClassName": "class2"      },      "__v": 0    }  ]}
PS:ip地址需要自己修改
可以通过"."(点)方法取出数据,取出userName方法result.userId.userName
参考文章:
http://geekblog.zhaoyan.me/mongoose-%E5%85%A5%E9%97%A8%E7%B3%BB%E5%88%97-schemas-and-models/#.VoxtGvmF6Ul
https://cnodejs.org/topic/5206581b44e76d216aae072e
http://segmentfault.com/a/1190000002727265
http://mongoosejs.com/docs/populate.html
http://ourjs.com/detail/53ad24edb984bb4659000013
资源下载:
http://download.csdn.net/detail/tangjiarao/9392633

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 捡到苹果7有id锁怎么办 魅族什么都忘了怎么办 海信电视百事通登陆失败怎么办 去哪儿换号了怎么办 ipan充不进去电怎么办 安卓数据线松了怎么办 索尼z5耳机掉漆怎么办 索尼z5无限重启怎么办 苹果8基带坏了怎么办 oppo手机忘记图案密码怎么办 电池充不进去电怎么办 电脑充不进去电怎么办 苹果5c白苹果怎么办 港行不支持电信卡怎么办 安卓导航不开机怎么办 鞭炮放一半不响怎么办 禁止鸣笛的地方鸣笛了怎么办 手被炮仗炸了怎么办 手被猴子抓伤了怎么办 炸东西剩的油怎么办 炸臭豆腐剩的油怎么办 油炸久了油发黑怎么办 炸鱼的时候粘锅怎么办 吃了葱蒜有味怎么办 哺乳期喝了抹茶怎么办 干炸小黄鱼凉了怎么办 烧鱼酱油放多了怎么办 夏天腿干燥起皮怎么办 螃蟹柿子同时吃了怎么办 柿子和螃蟹一起吃怎么办 螃蟹和柿子吃了怎么办 今天为什么很多网站打不开怎么办 网上报名人太多服务器卡怎么办 网站换了电脑打不开怎么办 感冒时后背发凉怎么办? 脚扭了脚背疼怎么办 五妙水仙膏干了怎么办 红苹果接不到任务了怎么办 我判刑了家里老母亲怎么办 离婚之前对方把财产转移怎么办 有人侵犯我的名誉权怎么办