Mongoose是针对Node.js异步环境为MongoDB数据库提供的对象模型库。Mongoose基于官方的原生MongoDB驱动node- mongodb-native实现,封装了MongoDB数据的常用操作方法,使Node.js程序操作MongoDB数据库变得更加灵活简单。
一、名词解释
Schema : 它是一种以文件形式存储的数据库模型骨架,不具备对数据库操作的能力,仅仅只是数据库在程序片段中的一种表现,可以理解为表结构。
Model : 由Schema发布生成的模型,具有抽象属性和行为的数据库操作对
Entity : 由Model创建的实体,他的操作也会影响数据库
二、Schema、Model、Entity的关系
Schema生成Model,Model创造Entity,Model和Entity都可对数据库操作造成影响,但
Model比Entity更具操作性。
三、命名规范(建议)
var StudentSchema; //Student的文本属性
var StudentModel; //Student的数据库模型
var StudentEntity; //Student实体
四、实现增、删、改、查(CRUD)
1、安装:
npm install mongoose
2、引用:
var mongoose = require('mongoose');
3、创建db.js文件用于连接MongoDB数据库
var mongoose = require('mongoose');
var DB_URL = 'mongodb://localhost:27017/mvc';
/** 链接 */
mongoose.connect(DB_URL,{useNewUrlParser:true,useUnifiedTopology:true });
/** 链接成功 */
mongoose.connection.on('connected',function() {
console.log('Mongoose connection open to '+DB_URL);
})
/** 链接异常 */
mongoose.connection.on('error',function(err) {
console.log('Mongoose connection error:'+err);
})
/** 链接断开 */
mongoose.connection.on('disconnectied',function() {
console.log('Mongoose connection disconnected');
})
module.exports = mongoose;
4、 创建UserSchema(user.js):
var mongoose = require('../../config/db.js');
var Schema = mongoose.Schema;
/** 定义User的Schema */
var UserSchema = new Schema({
username: { type: String },
password: { type: String },
age: { type: Number }
});
/** model 是由schema生成的模型,具有对数据库操作的能力 */
module.exports = mongoose.model('User',UserSchema);
5、插入数据(Model.save([fn])):
var liubei = new User({
_id: 1001,
username: '刘备',
password: '111111',
age:30
})
liubei.save(function(err,res) {
if(err){
console.log(err);
}else{
console.log(res);
}
})
6、更新数据(Model.updateOne(conditions, doc, [options], [callback]))
conditions: 更新的条件,该值是一个对象。
doc: 需要更新的内容,该值也是一个对象。
options: 可选参数,它有如下属性:
safe :(布尔型)安全模式(默认为架构中设置的值(true))
upsert :(boolean)如果不匹配,是否创建文档(false)
multi :(boolean)是否应该更新多个文档(false)
runValidators:如果为true,则在此命令上运行更新验证程序。更新验证器根据模型的模式验证更新操作。
strict:(布尔)覆盖strict此更新的选项
overwrite: (布尔)禁用只更新模式,允许您覆盖文档(false)
callback: 回调函数
var User = require('../schema/user.js');
/** 定义更新函数 */
function update() {
//更新数据的条件
let where_str = { 'username' : '曹操' };
//更新的数据
let update_str = { 'password' : 'abcdefg' };
User.updateOne(where_str,update_str,function(err,res) {
if(err){
console.log(err);
}else{
console.log(res);
}
})
}
update() //调用更新函数
7、更新并返回数据:返回更新前的数据
(Model.findOneAndUpdate([(conditions, doc, [options], [callback])])
/**
* 第一个参数conditions,用于给定查询我们数据库中name为香蕉的数据
第二个参数doc, set中设置了要更新的字段
第三个参数options,因为简单使用没用到,就只给了个空对象
第四个参数callback,
if(err) 是用于判断数据库是否发生错误,若数据库没发生错误,err为空,执行下一条语句;
若数据库发生错误,err为错误对象,不为空,执行该条语句,打印' 数据库发生错误 '
if(!data)用于判断是否正确查找到与我们第一个参数匹配的相关数据,若没查找到,data为null,!data不为空,执行该条语句,打印' 未查找到相关数据 ' 和一个 null;若查找到了,data为查找到的数据,!data为空,执行下条语句
if(data)用于处理与if(!data)相反的操作,查询到相关数据,则data不为空,执行该条语句,
打印 ' 修改数据成功 ' 和 我们查询到的该条数据信息;
*/
User.findOneAndUpdate({
username: '刘备'
},{
$set: {
password: 'aaaaaaaaaa'
}
},{},function(err,data){
if(err){
console.log("数据库错误!");
}
else if(!data) {
console.log("未找到数据!");
console.log(data);
}
else if(data) {
console.log("数据更新成功!");
console.log(data);
}
})
8、查询
var User = require('../schema/user.js');
//查询所有
User.find(function(err,data) {
if(err){
console.log(err)
}else{
console.log(data);
}
})
//按id查询
User.findById({
_id : '6077ec65465e955a83fc0457'
},function(err,data) {
if(err){
console.log(err)
}else{
console.log(data);
}
})
//多条件查询
User.findOne({
username: '诸葛亮',
age: 26
},function(err,data) {
if(err){
console.log(err)
}else{
console.log(data);
}
})
//记录数查询
User.count(function(err,data) {
if(err){
console.log(err)
}else{
console.log("记录数:"+data);
}
})
五、和Express框架结合
1、创建配置文件(db.js):
var mongoose = require('mongoose');
var DB_URL = 'mongodb://localhost:27017/mvc';
/** 链接 */
mongoose.connect(DB_URL,{useNewUrlParser:true,useUnifiedTopology:true });
/** 链接成功 */
mongoose.connection.on('connected',function() {
console.log('Mongoose connection open to '+DB_URL);
})
/** 链接异常 */
mongoose.connection.on('error',function(err) {
console.log('Mongoose connection error:'+err);
})
/** 链接断开 */
mongoose.connection.on('disconnectied',function() {
console.log('Mongoose connection disconnected');
})
module.exports = mongoose;
2、创建Schema(UserSchema.js),并生成模型
var mongoose = require('../../config/db.js');
var Schema = mongoose.Schema;
/** 定义User的Schema */
var UserSchema = new Schema({
username: { type: String },
password: { type: String },
age: { type: Number }
});
/** model 是由schema生成的模型,具有对数据库操作的能力 */
module.exports = mongoose.model('User',UserSchema);
3、创建路由文件:
var express = require('express');
var router = express.Router();
var User = require('../mongoose/schema/user.js'); //导入User模型
/**
* 插入记录:http://localhost:3000/api/add
*/
router.post('/add',async(req,res) => {
let user = new User({
username: req.body.username,
password: req.body.password,
age: req.body.age
});
user.save(await function(err,data){
if(err){
res.json({
code: 1000,
msg: '插入数据失败!',
})
}else{
res.json({
code: 200,
msg: 'success',
data: data
})
}
})
})
/**
* 查询记录:http://localhost:3000/api/find
*/
router.get('/find',async(req,res)=> {
User.find(await function(err,data) {
if(err){
res.json({
code: 1000,
msg: '查询失败!',
})
}else{
res.json({
code: 200,
msg: '查询成功!',
data: data
})
}
})
})
module.exports = router ;