一、mongoose 介绍
mongoose
是在node.js 异步环境下对mongodb 进行便捷操作的对象模型工具。mongoose
是NodeJS 的驱动,不能作为其他语言的驱动。
Mongoose
为模型提供了一种直接的,基于scheme结构去定义你的数据模型。它内置数据验证, 查询构建,业务逻辑钩子等,开箱即用。
Mongoose 有两个特点
- 1、通过关系型数据库的思想来设计非关系型数据库
- 2、基于
mongodb
模块 驱动,简化操作
二、mongoose 的安装以及使用
2.1 安装
npm install mongoose --save
2.2 引入mongoose并连接数据库
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test');
如果mongodb数据库有账号密码:
/**通过mongodb://username:password@host1:port/database_name?authSource指定验证前面身份信息的数据库来源 */
mongoose.connect('mongodb://账号:密码@ip地址:27017/集合名称?authSource=admin',{
useNewUrlParser: true,
});
connect()
返回一个状态待定(pending)的连接, 接着我们加上成功提醒和失败警告。
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
// we're connected!
});
2.3 定义Schema
Schema
mongoose 里会用到的一种数据模式,可以理解为表结构
的定义;每个schema 会映射到mongodb 中的一个collection
,它不具备操作数据库的能力,只是对数据库集合的各个字段类型的规范定义。
var UserSchema = mongoose.Schema({
name: String,
age: Number,
status: 'number'
})
2.4 创建数据模型
定义好了Schema
,接下就是生成Model
。model 是由schema 生成的模型,可以对数据库的操作。
mongoose.model 里面可以传入两个参数也可以传入三个参数:
- mongoose.model(参数1: 模型名称(首字母大写),参数2: Schema)
- mongoose.model(参数1: 模型名称(首字母大写),参数2: Schema,参数3: 集合名称)
如果传入2 个参数的话: User
模型会默认去操作与User
模型同名的复数形式的集合,如通过下面方法创建模型,那么这个模型将会操作users
这个集合:
var User = mongoose.model('User', UserSchema);
如果传入3 个参数的话:模型默认操作第三个参数定义的集合名称,如下面的代码,模型User
会指定操作user
这个集合:
var User = mongoose.model('User', UserSchema, 'user');
2.5 增
var Tank = mongoose.model('Tank', yourSchema);
var small = new Tank({ size: 'small' });
/*实例.save((err,docs)=>{回调函数}) 来将数据保存到数据库*/
small.save(function (err) {
if (err) return handleError(err);
// saved!
})
// or
Tank.create({ size: 'small' }, function (err, small) {
if (err) return handleError(err);
// saved!
})
2.6 删
// 删除操作三个选择
// Model.remove()可选择删除一条还是多条
// Model.deleteOne 删除一个
// Model.deleteMany() 删除所有匹配的文档
// 仅删除匹配的第一个文档,single设置为true
1. userModel.remove({userName: '月月'}, {single: ture},(err,rs01) => console.log(rs01))
// { acknowledged: true, deletedCount: 1 }
// 删除一个
2. userModel.deleteOne({ userName: '肖肖' }, (err,rs02) => console.log(rs02))
// { acknowledged: true, deletedCount: 1 }
// 删除所有匹配的文档
3. userModel.deleteMany({nickNmae: '22'}, (err,rs03) => console.log(rs03))
// { acknowledged: true, deletedCount: 2 }
// 通过文档的 _id 字段发出 mongodb findAndModify 删除命令。findByIdAndRemove(id, ...)相当于findOneAndRemove({ _id: id }, ...)
4. userModel.findByIdAndRemove(id, (err,rs04) => console.log(rs04))
// {
// _id: new ObjectId("62470f9b5e96608b809e4424"),
// username: '狗剩',
// age: 19,
// sex: 1,
// password: '$2b$10$RfZk7RMvIMuwxGSBeTPSQeSBYcgrNy9T7a.Rf8J35dMnKEncDY9XW',
// createTime: 1648824219480,
// __v: 0
// }
2.7 改
1. async function setData(){
// 1.查询
let hh = await userModel.findOne({userName: '花花'})
// 2.修改数据------修改数据参数值的方法set()
hh.set({
gender: 1
})
// 3.重新插入数据库
hh.save()
console.log(hh)
}
setData()
// 查询并修改(查找条件,更新的数据)
// userModel.findOneAndUpdate()
2. userModel.findOneAndUpdate({nickNmae:'88'},{userName:'66'},{new:true},(err,rs) => console.log(rs))
3. News.updateOne(
{'_id':'5cf5e613ba3c6298a8734973'}, // 条件
{title: '这是一则新闻111'}, // 要更新的内容
/* 回调函数 */
(err, docs)=>{
if(err){return console.log('更新数据失败');}
console.log(docs);
}
)
2.8 查
// 1.
userModel.findOne({ userName :'肖肖'},function (err,result) {
err ? console.log('没有数据' + err) : console.log(result)
})
// 2.
async function getData(){
let rs = await userModel
.find()
.or({gender:0}) // 女生
.sort({_id:'desc'}) // 倒叙
.limit(2) // 显示2条
.skip(1) // 跳过前1条
console.log(rs)
}
getData()
// 3. 分页查询
const totalList = await usersModel.getTotal(query)
const dataList = await usersModel.getUserList(query, req.query)
res.render('success', {
data: JSON.stringify( {
total: totalList.length,
curPage: req.query.curPage,
dataList
})
})
// usersModel
const getTotal = (query) => {
return Users.find(query)
}
// 获取用户列表
const getUserList = async (query, body) => {
return Users.find(query)
.skip((body.curPage - 1) * body.pageSize)
.limit(parseInt(body.pageSize) || 20)
.sort({ createTime: body.sort })
.select({ // 定义要查询的字段
_id : 1,
username: 1,
sex: 1,
age: 1,
createTime: 1,
modifyTime: 1
})
}