mongoose可以让我们用node操作mongoDB模块,对node原生的MongoDB模块优化封装,将里面的文档映射成了对象
好处:1.可以创建模式结构(schema)因为非关系数据库导致数据库没有类型限制。2.可以对模型中的对象进行验证3.数据 可以通过类型转化成对象模型4.中间件应用业务逻辑挂钩
说白了mongoose提供三个对象供我们使用,第一个schema模式对象,约束数据库的文档结构,限制类型比如name只能是字符串。model对象作为集合中所有的文档标识相当于MongoDB数据库中的集合。Document集合中的具体文档集合中的某一个具体文档。
创建顺序为schema -----model -----document.
1.mongoose库的使用
前面提到了数据库的操作我们都在可视化工具的shell输入命令,很不方便虽然有了提示,但是无法真正的和项目连接,这个库可以让我们在node环境也就是我们的后端代码中直接连接数据库并且进行增删改查,也就是json文件可以存到数据库的服务器中,而我们的后端代码相当于数据库的客户端。
1.连接数据库
lua
/*
1.下载安装mongoose
npm install mongoose --save
2.项目中引入
const mongoose = require("mongoose")
3.连接mongodb数据库
const mongoose = require('mongoose');
mongoose.connect('mongodb://数据库的协议//127.0.0.1:27017//数据库的ip地址端口号/test//数据库名称');
//如果端口号是默认的27017 则可以省略不写
4.监听MongoDB数据库的
--在mongoose对象中有一个属性叫做connection 该对象表示的就是数据库连接
通过监视该对象的状态可以监听数据库的连接与断开
//数据库连接成功的事件
mongoose.connect.once("open",function(){})
//数据库断开连接的事件
mongoose.connect.once("close",function(){})
//断开数据库的连接
mongoose.disconnect()
Schema
Modal
Document
*/
const mongoose = require("mongoose");
async function main() {
try {
// 连接数据库
await mongoose.connect("mongodb://127.0.0.1/mongoose_test", {
useNewUrlParser: true,
useUnifiedTopology: true
});
console.log("数据库连接成功");
} catch (err) {
console.error("数据库操作出错:", err);
}
}
main();
简单的引入mongoose对象然后调用connect方法输入我们的数据库服务器地址就可以连接了,后面的是对应的数据库名称。然后运行控制台就会提示连接成功。
编辑
2.创建schema模式对象给我们集合限制文档格式以及Model对象的方式对文档的增删改查
javascript
const mongoose =require("mongoose")
mongoose.connect("mongodb://127.0.0.1/mongoose_test",{
useNewUrlParser: true,
useUnifiedTopology: true
}
)
mongoose.connection.once("open",function(){
console.log(' 数据库连接成功', )
})
//创建schema模式对象
const Schema = mongoose.Schema
const stuSchema = new Schema({
name:String,
age:Number,
gender:{
type:String,
default:'female'
},
address:String
})
//通过Schema创建Model 代表数据库中的集合 通过Model才能对数据库进行操作
//mongoose.model(modelName,schema)
//modelName就是映射的集合名 mongoose自动将集合名变成复数
const StuModel = mongoose.model("student",stuSchema)
//向数据库中插入文档
// StuModel.create({name:'孙悟空',age:22,address:'花果山'}).then(()=>{
// console.log('插入成功')
// })
/*
有了model就可以对数据库进行增删改查的操作
create({docs})创建一个文档或者多个文档到数据库中
*/
// StuModel.create([
// {
// name:'猪八戒',
// age:11,
// address:'高老庄'
// },
// {
// name:'唐僧',
// age:99,
// address:'长安'
// }
// ]).then(()=>{
// console.log('插入成功')
// })
//find查询所有符合条件的文档 findById查询文档id属性查询文档 findOne查询第一个文档 总会返回数组
//第二个参数要什么写什么 _id默认携带 投影(需要获取的字段)19.20
// StuModel.find({name:'孙悟空'},{name:1}).then((item)=>{
// console.log('item',item)
// })
//findOne返回的是一个具体的文档对象
// StuModel.findOne({name:'孙悟空'},{name:1}).then((item)=>{
// console.log('item',item.name)
// })
//根据Id找 不需要加ObjectId
// StuModel.findById("68a3f28b84b6107ef437811a",{name:1}).then((item)=>{
// console.log(item instanceof StuModel) //true
// console.log('item',item)
// })
//item就是通过find查询的结果 就是document文档对象
//document对象是Model的实例 集合是谁就是谁的实例
/*
修改
update用来修改或者多个文档 参数conditions 查询条件
doc 修改后的对象
options配置参数
/
// StuModel.find({}).then(item=>{
// console.log(item)
// }
// )
// StuModel.updateOne({name:'唐僧'},{$set:{age:20}}).then(item=>{
// console.log(item)
// })
/
删除
都是传一个条件
remove
deleteOne
deleteMany
*/
// StuModel.deleteMany({name:'孙悟空'}).then(item=>{
// console.log(item)
// })
StuModel.countDocuments({}).then(count => {
console.log("文档总数:", count)
})
这里我们用model方法比如find.delete,findOneAndUpdate({},{})等对文档进行增删改查后,数据库对应model集合数据就会对应的增删改查。
编辑
编辑
值得一提的是现在版本的mongoose的增删改查方法都为异步比如find之后需要用.then去获取查找的数据。其他同理。
3.文档对象
文档对象是根据我们创建好的model对象生成的,里面的方法比如save存到集合中,不过很少用,知道就可以,一般只用model就可以满足大多需要。
javascript
/*
Document和集合中的文档一一对应
Document是Model的实例
通过Model查询到的结果都是Document
*/
//创建一个Document
const mongoose =require("mongoose")
mongoose.connect("mongodb://127.0.0.1/mongoose_test",{
useNewUrlParser: true,
useUnifiedTopology: true
}
)
mongoose.connection.once("open",function(){
console.log(' 数据库连接成功', )
})
//创建schema模式对象
const Schema = mongoose.Schema
const stuSchema = new Schema({
name:String,
age:Number,
gender:{
type:String,
default:'female'
},
address:String
})
// 根据 schema 创建模型(注意名字)
const StuModel = mongoose.model("student", stuSchema)
const stu = new StuModel({
name:'上博客',
age:44,
address:'波比'
})
console.log(stu)
/*
document方法
save
update
--修改对象 不用传条件
remove
*/
// stu.save().then(()=>{
// console.log('保存成')
// })
StuModel.findOneAndUpdate({name:'唐僧'},{$set:{age:100}},{new:true}).then(item=>{
console.log('找到并更新成功',item)
})
/*
get()
set()
*/