原生JS连接MongoDB太麻烦了,所以需要使用第三方库:mongoose
mongoose是一个ODM(对象文档模型),JS对象可以映射成文档,所以叫对象文档模型。JSON -> BSON。
为什么用?现在node平台下更加简单、高效、安全、稳定的操作MongoDB
// 引入mongoose
const mongoose = require('mongoose');
/*
* 首先需要根据一个地址去连接数据库,所以先创建一个地址字符串,有几个注意点
* 1.协议名是 mongodb
* 2.端口号不要错
* 3.除了端口号,还需要指定具体连接哪儿一个数据库,在端口号后面跟随,如下连接的是test库
*/
const dbURL = 'mongodb://localhost:27017/test';
// 连接数据库
mongoose.connect(dbURL);
// 绑定数据库连接监听
mongoose.connection.on("open", (err) => {
if(err) {
cosnole.log("connect failed...", err);
} else {
console.log("Success!");
}
})
需要注意的是,连接操作是一个异步操作,如果需要在连接之后进行数据库操作,那么需要进行异步处理,或把操作逻辑放在上述代码的else里面。
上述代码有一些问题,会触发两个报错,这是因为API有变动,新版本,在连接数据库的时候,需要指定一个配置对象。
mongoose.connect(dbURL, {
// 内置了两个URL解析器,而现在默认是使用久的,会有安全问题等等
// 那么下面的配置就是说,要是用新版本的URL解析器
useNewUrlParser: true,
// 统一拓扑结构,老的结构有一些效率问题
// 那么下面的配置就是说,当操作数据库的时候使用
useUnifiedTopology: true
});
当进行增删改查之前,我们需要了解几个核心的对象,因为很多接口都是放在他们的身上的。
同时,在进行增删改查之前,我们还需要对数据进行校验,因为MongoDB的自由度很高,所以校验工作需要自己在后端代码中添加对应逻辑。
mongoose.connection.on("open", (err) => {
if(err) {
cosnole.log("connect failed...", err);
} else {
console.log("Success!");
// 把数据库看做是一个别墅,对于进入别墅的人要进行确认才可放行(校验后进行增删改查)
// 1.请一个保安守门
let Schema = mongoose.Schema;
// 2.制定进入别墅的规则(进行增删改查的数据的格式校验)
let enterRule = new Schema({
name: {
type: String,
required: true
},
id_num: {
type: Number, // 设置编号只能为数字
required: true, // 必填
unique: true// 必须唯一
},
sex: {
type: String,
required: true
},
hobby: [String], // 数组,其中只能填字符串
info: Schema.Types.Mixed, // 所有类型都行
date: { // 操作该数据的时候的时间
type: Date,
default: Date.now() // 如果没有写,设定默认值
}
})
// 3.告诉保安自己制定的放行规则(绑定拦截器,去验证数据)
// 用户生成某个集合对应的模型对象
let enterModel = mongoose.model("enter", enterRule)
}
})
上面的代码使用了一种通俗的语言去注释每一步,但是规范的说法应该是这样的:
在上面我们创建了一个名为enterModel
的模型对象,而进行增删查改的接口就在这上面。
下面代码是紧接着上面的代码写的
console.log("Success!");
... // 上面写过的就不再复制过来占地方了
// 4.真正有人来了,要进入别墅了
enterModel.create({
name: "Arui",
id_num: 10086011,
sex: "male",
hobby: ["乒乓球","网络游戏"],
info: {
remarks: "Noting"
}
}, (err, data) => {
if(!err) console.log(data);
else console.log(err);
})
上面使用了一个create
方法去实现写入,这个方法接收两个参数,第一个参数为插入对象,第二个参数为操作后的回调函数,回调函数第一个参数为错误对象,第二个参数为成功增添的数据。
和上面一样的格式,我就直接写了:
// 5.查询
enterModel.find({name:"菜菜菜"}, (err, data) => {
// find方法返回的是一个数组
// 就算是只有一条数据,也是数组
// 如果查询结果为空,返回空数组
if (!err) {
console.log(data);
} else {
console.log(err);
}
})
// 查询单个,使用findOne方法
// 如果查询到,直接返回,不用数组包裹
// 如果没有查询到,返回Null
有两个方法可以用:
模型对象.updateOne(查询条件,要更新的内容)
模型对象.updateMany(查询条件,要更新的内容)
几个点:
- 上面两个方法都可以追加第三个参数,配置对象参数
- 不管有几个参数,回调函数放在最后一个参数就行了,同样接收 err 和 data
- 存在update方法,但是不要用,不知道什么时候就被废弃了,如果使用这个接口,当条件查询匹配到多个的时候,依然只修改一个
删除有两个方法可以用:
模型对象.deleteOne(查询条件)
模型对象.deleteMany(查询条件)
注意:
和update不一样!没有delete方法!