Mongoose
mongoose 是一 个让我们可以通过Node来操作MongoDB的模块。 Mongoose是一 个对象文档模型( ODM)库(把文档转换为js 对象,易于操作),它对Node原生的MongoDB模块进行了进-步的优化封装,并提供了更多的功能。 在大多数情况下,它被用来把结构化的模式应用到一一个MongoDB集合,并提供了验证和类型转换等好处
-
优点
-
可以为文档创建一个模式结构(Schema)/或者叫做一种类似于SQL 数据库的约束
-
可以对模型中的对象/文档进行验证
-
数据可以通过类型转换转换为对象模型
-
可以使用中间件来应用业务逻辑挂钩
-
比Node原生的MongoDB驱动更容易
-
-
mongoose中为我们提供了几个新的对象
- Schema(模式对象)
Schema对象定义约束了数据库中的文档结构
- Model (对应MongoDB的 集合collections)
Model对象作为集合中的所有文档的表示,相当于 MongoDB数据库中的集合collection
- Document
Document表示集合中的具体文档,相当于集合中 的一个具体的文档
创建顺序 :Schema- >Model->Document
使用
安装
引入
连接
- mongoose.connect 方法
mongoose.connect('mongodb://ip:端口/数据库名')
mongoose.connect('**mongodb**://localhost:27017/test',{ useUnifiedTopology: true ,useNewUrlParser:true})
//注:如果linux/windows的mongodb 设置了用户验证,需要在连接时输入用户名密码
mongoose.connect('mongodb://username:pass@127.0.0.1/crud?authSource=admin',{ useUnifiedTopology: true ,useNewUrlParser:true});
//authSource=admin 参数规定 用于验证的用户来自 admin 数据库
端口号若是27017,可省
-
监听数据库连接状态
mongoose 对象的connection 属性,可以绑定事件
比如,可以通过open和**close **事件来监控连接 的打开和关闭。
-
断开连接
mongoose.disconnect() 一般不使用
-
操作数据库
-
创建 模式对象 Schema ,修饰文档结构
const stuSchema=new mongoose.Schema({ name:String, age:Number, address:String, gender:{ type:Number, default:0 } }); -
创建Model 对象(创建集合)或者 Document 对象
//mongoose.model(modelName, schema) //modelName =集合名 ,会被转换为复数 const StuModel= mongoose.model('studs',stuSchema); //返回一个构造函数 -
操作
//创建并插入文档 StuModel.create({ name:"baikujing", age:'100', },(err)=>{ if(!err) { console.log('插入成功'); } })
-
mongoose 所有api 方法都返回 promise
Schema
MongoBD 本身很灵活,不需要设计结构
但是还是需要一定程度上 的 字段约束,保证 数据添加的 正确性,
使用Schema 模式结构对象,对文档的属性 字段进行描述,约束, 这样mongoose 还可以帮助我们进行验证和类型转换
Model
Model 类 对应 集合,通过Model 操作数据库,也就是db.操作数据库
mongoose.model('studs',stuSchema);方法返回一个 构造函数,new 构造出的就是 Document 实例
以下可以称作 Model 类的 静态方法,
增
-
Model.create(doc(s),[options],[callback])
-
doc(s): Array/Object
-
options: 传递给 中间件 **save()**方法的参数
-
callback:(err,doc(s))/(错误对象,插入的内容)
-
return :Promise
mongose 绝大部分方法 返回Promise ,可以使用then ,或者 await
-
查
-
Model.find(filter ,[projection] ,[options],[callback])
-
filter :查询条件
-
projection :投影对象或字段**字符串,**决定结果要显示的字段
-
options: 查询选项,skip,limit,sort 等
-
callback :(err,docs) docs 始终为数组
回调函数必传或者使用then(await )接收返回数据,否则不会查询
//projection 参数 //1. 使用mongodb 的对象形式 StuModel.find({age:1000},{name:true,_id:0}).then(docs=>{ console.log(docs); }) //2. 使用字符串 StuModel.find({age:1000},'name age -_id').then(docs=>{ console.log(docs); })// -_id 不显示_id //options 查询选项 参数 StuModel.find({},'name age -_id',{skip:3,limit:3,sort:{age:-1}}).then(docs=>{ console.log(docs); }) // 使用 then 处理 promise StuModel.find({age:1000}).then(docs=>{ console.log(docs); })
-
-
Model.findOne(filter ,[projection] ,[options],[callback])
查询第一个返祖filter 的文档对象,
callback: (err,doc) doc单个文档对象
doc 是 Model 构造方法 构造出的实例
-
Model.findByID(id,[projection] ,[options],[callback])
callback: (err,doc) doc单个文档对象、
改
-
Model.update(filter ,doc,[options],[callback])
-
options: 选项,multi 等
-
callback :( error, updateWriteOpResult)
updateWriteOpResult:原生 mongoDB 返回的操作结果
回调函数必传或者使用then(await )接收返回数据,否则不会更新
StuModel.update({name:'zhubajie'},{$set:{age:1000}},{multi:true},(err)=>{})updateWriteOpResult:
属性
- n:匹配到的个数
- nModified:更改个数
- ok:更新是否成功
-
-
Model.updateMany(filter ,doc,[options],[callback])
-
Model.updateOne(filter ,doc,[options],[callback])
-
Model.replaceOne(filter ,doc,[options],[callback])
删
-
Model.remove(filter ,[options],[callback])
-
options
-
callback
回调函数必传或者使用then(await )接收返回数据,否则不会更新
StuModel.deleteOne({name:"666"},err=>{})
-
-
Model.deleteOne(filter ,[options],[callback])
-
Model.deleteMany(filter ,[options],[callback])
其他
-
Model.count(filter,[callback])
统计 个数
// 统计所有个数 StuModel.count({},(err,count)=>{ console.log(count); }) StuModel.countDocuments({},(err,count)=>{ console.log(count); })
将在下一个版本移除,推荐使用countDocuments 方法代替 in v 5.927
Document
Document 是Model 构造的 实例
//创建 Document 实例
const stu=new StuModel({
name:"小米",
age:20
});
console.log(stu);
实例方法
-
doc.save([options],callback)
将文档保存到集合
- callback :(err,updateWriteOpResult)
-
doc.update(update,[options],callback)
-
update
-
callback : (err)
回调函数必传或者使用then(await )接收返回数据,否则不会更新
-
将要弃用 ,推荐 document.updateOne/updateMany 代替 in v 5.927
// 创建一个 docuemnt 对象
const stu = new StuModel({
name: "小米",
age: 20
});
(async function () {
await stu.save();
StuModel.findOne({ name: "小米" }, async (err, doc) => {
console.log(doc);
let res;
doc.update({ $set: { age: 777 } });
// console.log(res);
//第二种方法
doc.address = "武汉小米";
res = await doc.save();
// console.log(res);
//删除
res = await doc.remove();
// console.log(res);
})
})()
-
doc.remove([callback])
-
doc.get(feild)
-
doc.set(feild,value)
-
doc.toJSON([options])
转换为JSON对象
- options 选项参数
-
doc.toObject([options])
返回 js 普通对象,返回的对象 没有Document 的实例属性和方法
options 和toJSON方法一致
Mongoose 的模块化
抽离模块
-
连接模块
专门用于和数据库进行连接
-
模型对象模块
抽象出不同的Model 对象,并导出,在路由内调用,操作数据库
放置在不同文件夹