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
- nodejs+mongoose简单关联+增删改查
- NODEJS mongoose 增删改查
- 【Mongoose】Mongoose增删改查
- mongoose增删改查
- Nodejs基于mongoose模块的增删改查
- [mongodb] mongoose增删改查
- 初学nodejs一星期 做了一套mongoose + express最新版的增删改查 很简单实用 希望大家一起成长
- nodejs和mongoose实现的对mongodb数据库进行的增删改查操作模板
- express+mongoose+jade页面增删改查
- mongoose 增删改查 基础篇
- [mongo] mongoose增删改查操作
- mongoose的增删改查操作
- NodeJs实现简单登录增删改查、登录Demo
- 使用 NodeJS+Express+MySQL 实现简单的增删改查
- node.js结合mongoose对表单进行数据简单的增删改查
- mongoose创建数据结构,实现基本增删改查功能
- nodejs对mongodb的增删改查
- nodeJs链接Mysql,做增删改查
- StreamCQL 1.1版本RoadMap
- VLIB中边缘检测算法学习
- 走出平面-3D 捕获与分享
- c#中的static
- JVM--性能分析
- nodejs+mongoose简单关联+增删改查
- Matlab图像处理:误拒率、误识率意义,计算等错误率的Matlab源码
- fiddler的使用
- x2检验
- 《swift2.0 官方教程中文版》 第3章-01关于语言参考&词法结构
- Java 实验:数据结构
- 【LEETCODE】64-Minimum Path Sum
- Guava学习笔记:Google Guava 类库简介
- 归并排序