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

本篇文章是关于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
--------------------- 
作者:tangjiarao 
来源:CSDN 
原文:https://blog.csdn.net/tangjiarao/article/details/50467804 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值