mongoose模块
一. 概念:
介绍:是一个第三方模块, 作用:方便在nodejs代码中操作mongodb
GitHub 地址: https://github.com/Automattic/mongoose
★ nodejs-mongo-mongod关系图:
二、mongoose主要知识点:
1. _id 是 mongodb 集合中的默认主键. 是唯一的.
2. schema 、 model 与 entity 的关系: 符合ORM
★ ORM 对象数据绑定文档集合,对象在文档就在,对象不再文档也就不再。
## 类比: 生产瓶盖
Schema(架构) => 模具设计稿
Model(模型) => 模具
Entity(实体) => 瓶盖
## mongoose 命名时的推荐: 为了方便好记
UserSchema UserModel UserEntity
ArticleSchema ArticleModel ArticleEntity
GoodsSchema GoodsModel GoodsEntity
3. 一般集合数据表名定义为英文单词单数,mongoose 会自动将集合名称变成复数.
4. schema设定文档字段允许的字段类型:
String
Number
Date
Buffer (字符串类型)
Boolean
Mixed (任意类型)
ObjectId (主键信息数字ID)
Array
三. 代码使用:
1. 进入工作目录: cd 文件夹路径
2. 安装: cnpm install mongoose --save
3. 操作: 代码栗子链接
3.1 插入数据
//实体对象 var ArticleEntity = new ArticleModel({ title: 'cctv', content: '下雨天', author: 'xf', date: Date.now(), click: 1 }); //写入 save 保存 ArticleEntity.save(function(err, doc){ if(err){ console.log(err) }else{ console.log(doc); } mongoose.connection.close(); })
//1. 引入mongoose var mongoose = require('mongoose'); //2. 连接mongodb数据库 mongoose.connect('mongodb://localhost/db3'); //3. 定义文档结构 var UserSchema = new mongoose.Schema({ username: String, password: String, }, {versionKey: false}); //4. 定义模型 var UserModel = mongoose.model('user', UserSchema); //5. 创建实体 var UserEntity = new UserModel({ username: 'admin', password: 'adminxxxxx' }); //6. 写入数据库 UserEntity.save(function(err, user){ if(err){ console.log(err); }else{ console.log(user); } //7. 关闭连接 mongoose.connection.close(); });
或者另一种方法插入数据:
articleModel.create(req.body, function (err) { })
3.2 删除数据
ArticleModel.find({id: 100}).remove(function(err){ });
UserModel.remove({id: 200}, function(err){ })
var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/db6'); //文档结构 var ArticleSchema = new mongoose.Schema({ title: String, content: String, author: String, date: Date, click: Number }); //创建模型 var ArticleModel = mongoose.model('article', ArticleSchema); //删除 方式一 /** * ArticleModel.find({click:1}).remove(function(err){ if(err) { console.log(err) }else{ console.log('delete'); } mongoose.connection.close(); }) */ // 方式二 ArticleModel.remove({a:'b'}, function(err){ if(err){ console.log('err') }else{ console.log('删除成功'); } mongoose.connection.close(); })
3.3 更新数据
ArticleModel.update({id: {$lt:24}}, {$set:{'title': 'xxx'}}, function(err){ });
var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/db6'); //文档结构 var ArticleSchema = new mongoose.Schema({ title: String, content: String, author: String, date: Date, click: Number }); //创建模型 var ArticleModel = mongoose.model('article', ArticleSchema); //更新数据 ArticleModel.update({title:'aaa'}, {$set:{author: '明月'}}, function(err){ if(err){ console.log(err) }else{ console.log('更新成功'); } mongoose.connection.close(); })
3.4 获取数据 ===> 回调函数中可以对data进行更新修改save或删除remove操作
获取单条数据: ArticleModel.findOne({_id:'5b8788d68711943d60ff923b'}, function(err, doc){ });
根据唯一主键_id查找:ArticleModel.findById('5ab0658ec66711071a6be35a', function(err, data){ })
获取多条数据: ArticleModel.find({id:{$lt:26}}, function(err, data){ })
统计文档的数量: UserModel.count({}, function(err, data){ console.log(data); });
var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/db6'); //文档结构 var ArticleSchema = new mongoose.Schema({ title: String, content: String, author: String, date: Date, click: Number }); //创建模型 var ArticleModel = mongoose.model('article', ArticleSchema); //获取单条数据 // ArticleModel.findById('5b8666bc6c6e0fc58352f96a', function(err, doc){ // console.log(doc); // mongoose.connection.close(); // }); // ArticleModel.findOne({}, function(err, data){ // console.log(data); // mongoose.connection.close(); // }); // //多条查询 // ArticleModel.find({}, function(err, data){ // console.log(data); // mongoose.connection.close(); // }); // //统计 // ArticleModel.count({}, function(err, count){ // console.log(count); // mongoose.connection.close(); // }); //更新 // ArticleModel.findById('5b8666bc6c6e0fc58352f96a', function(err, doc){ // ArticleModel.findOne({_id:'5b8666bc6c6e0fc58352f96a'}, function(err, doc){ // doc // console.log(doc); // doc.author = '马剑'; // doc.save(function(err){ // if(err){ // console.log(err) // }else{ // console.log('更新成功'); // } // mongoose.connection.close(); // }) // }); //删除 ArticleModel.findById('5b8666bc6c6e0fc58352f96a', function(err, doc){ // doc doc.remove(function(err){ if(err){ console.log(err) }else{ console.log('删除成功'); } mongoose.connection.close(); }) });
3.5 查询数据
3.5.1 条件:
小于: ArticleModel.find({id: {$lt: 24}}, function(err, data){ });
模糊查询: ArticleModel.find({title: {$regex: /连衣裙/}}, function(err, data){ });
逻辑与: ArticleModel.find({title: {$regex: /连衣裙/}, id:{$gt: 1490}}, function(err, data){ });
逻辑或: ArticleModel.find({$or:[{id:{$gt:1490}}, {title:{$regex:/连衣裙/}}]}, function(err, data){ });
3.5.2 字段: 限定筛选出来的数据哪些字段是要显示的
ArticleModel.find({id:{$lt: 24}}).select({id:1}).exec(function(err, data){ })
3.5.3 截取: 应用场景主要用于分页显示效果
ArticleModel.find({id:{$lt: 30}}).limit(5).exec(function(err, data){ })
ArticleModel.find({id:{$lt: 30}}).skip(5).limit(5).exec(function(err, data){ })
3.5.4 排序:
ArticleModel.find({id:{$lt: 30}}).sort({id:-1}).exec(function(err, data){ })
var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/project'); //定义结构 var GoodsSchema = new mongoose.Schema({ id: Number, title: String, price: Number, pic: String, user_id: Number }); //创建模型 var GoodsModel = mongoose.model('goods', GoodsSchema); // 读取数据 /* GoodsModel.find({price: {$lt: 9.9}}, function(err, data){ if(err){ console.log(err) }else{ console.log(data); } mongoose.connection.close(); }); */ // 读取数据 模糊查询 /* GoodsModel.find({title: {$regex: /显瘦/}}, function(err, data){ console.log(data); mongoose.connection.close(); }); */ //字段筛选 /* GoodsModel.find().select({id:1,_id:0,title:1}).exec(function(err, data){ console.log(data); mongoose.connection.close(); }); */ //截取数据 /* GoodsModel.find().limit(5).exec(function(err, data){ console.log(data); mongoose.connection.close(); }) GoodsModel.find().skip(5).limit(5).exec(function(err, data){ console.log(data); mongoose.connection.close(); }); */ //排序 先排序后截取 GoodsModel.find().limit(5).sort({id:1}).exec(function(err,data){ console.log(data); mongoose.connection.close(); });
四. 数据关联
// 引入数据库配置模块 var mongoose = require('../configs/db_config.js'); // 定义 user 数据的 骨架(用来约束 itmes 这个集合的) var articleSchema = new mongoose.Schema({ // 关联栏目 itemId:{ type: 'ObjectId', // 关联集合 ref:'item' }, // 文章标题 title: String, // 作者 author: String, }) // 3.创建数据库模型 (在数据库里创建集合的时候 会自动帮你变成 复数) var articleModel = mongoose.model('article', articleSchema); // 暴露数据库模型 module.exports = articleModel;
// 引入数据库配置模块 var mongoose = require('../configs/db_config.js'); // 定义 user 数据的 骨架(用来约束 itmes 这个集合的) var itemSchema = new mongoose.Schema({ // 栏目名称 name: String, // 创建时间 ctime: { type:Date, default: new Date() // 默认值 }, // 栏目的排序 order:Number, // 栏目描述 description: String }) // 3.创建数据库模型 (在数据库里创建集合的时候 会自动帮你变成 复数) var itemModel = mongoose.model('item', itemSchema); // 暴露数据库模型 module.exports = itemModel;
// populate 去查关联的集合 articleModel.find().populate('itemId',{name:1}).exec(function (err, data) { console.log(data); if (err) { console.log('数据添加数据失败'); } else { // 响应模版 发送数据 res.render('admin/articleList', { articlelist: data}); } })