Mongoose 是一个对象文档模型(ODM)
库,它对 Node 原生的 MongoDB 模块进行了进一步的优化封装,并提供了更多功能。Mongoose 就是让我们通过 Node 来操作 MongoDB 的模块
Mongoose 为我们提供几个新的对象:(关系顺序:Schema->Model->Document)
- Schema(模式对象):Schema 对象定义约束了数据库中的文档结构
- Model:Model 对象作为集合中的所有文档的表示,相当于 MongoDB 数据库中的集合 collection
- Document:Document 表示集合中具体的文档,相当于集合中的一个具体文档
使用 Mongoose
- 在项目中安装
npm install mongoose --save
- 引入
var mongoose = require('mongoose')
- 连接 MongoDB 数据库
mongoose.connect('mongodb://数据库ip地址:端口号/数据库名', {useNewUrlParser: true, useUnifiedTopology: true})
如果端口号是默认端口号(27017),则可以省略不写 - 断开数据库连接(一般不需要使用)
mongoose.disconnect()
PS:MongoDB 数据库一般情况下,只需要连接一次,连接一次后,除非项目停止服务器关闭,否则不会断开
监听 MongoDB 数据库的连接状态
在 mongoose 对象中,有一个属性叫做connection
,该对象表示的就是数据库连接,通过监听该对象的状态,可以监听数据库的连接与断开
数据库连接成功的事件
mongoose.connection.once("open", function(){});
数据库断开的事件
mongoose.connection.once("close", function(){});
Schema 和 Model 的具体操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//将mongoose.Schema赋值给一个变量
var Schema = mongoose.Schema;
//创建Schema对象
var stuSchema = new Schema({
name: String,
age: Number,
gender: {
type: String,
default: "female",
},
address: String,
});
//通过Schema来创建Model(Model代表数据库中的集合,通过Model才能对数据库进行操作)
//mongoose.Model(modelname,schema)
// modelname:要映射的集合名(mongoose会自动将集合名变成复数);
// scheam:对应哪个模型
var stuModel = mongoose.model("student", stuSchema);
Model 的方法
一、增
Model.create(doc(s), [callback])
:用来创建一个或多个文档并添加到数据库中
参数:
doc(s):可以是一个文档对象,也可以是一个文档对象的数组
callback:当操作完成以后调用的回调函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
stuModel.create(
[
{
name: "LiLy",
age: 20,
gender: "female",
address: "ShangHai",
},
{
name: "Jhon",
age: 22,
gender: "male",
address: "NewYork",
},
],
(err) => {
if (!err) {
console.log(arguements);
console.log("插入成功...");
}
}
);
二、查
1. Model.find(conditions, [projection], [options], [callback])
:查询所有符合条件的文档,返回数组
2. Model.findById(id, [projection], [options], [callback])
:根据文档的 id 属性查询文档
3. Model.findOne([conditions], [projection], [options], [callback])
:查询符合条件的第一个文档,返回具体的文档对象
参数:
conditions:查询条件
projection:投影需要获取的字段,两种方式:1.{name:1, _id:0} 2.”name -_id”
options:查询选项(skip limit)
callback:回调函数,查询结果通过回调函数返回
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
stuModel.find(
{
age: 18,
},
"name age -_id",
{ skip: 2, limit: 1 },
(err, docs) => {
if (!err) {
console.log(docs);
}
}
);
//--------------------------------------
stuModel.findById("5e7a156435bace7880a78590", (err, doc) => {
if (!err) {
console.log(doc);
}
});
三、改
1. Model.update(conditions, doc, [options], [callback])
:修改一个或多个文档
2. Model.updateMany(conditions, doc, [options], [callback])
:修改多个文档
3. Model.updateOne(conditions, doc, [options], [callback])
:修改一个文档
4. Model.replaceOne(conditions, doc, [options], [callback])
:替换一个文档
参数:
conditions:查询条件
doc:修改后的对象 options:配置参数
callback:回调函数
1
2
3
4
5
stuModel.update({ name: "LiLy" }, { $set: { age: 33 } }, (err) => {
if (!err) {
console.log("修改成功");
}
});
四、删
1. Model.remove(conditions, [callback])
:删除一个或多个文档
2. Model.deleteOne(conditions, [callback])
:删除多个文档
3. Model.deleteMany(conditions, [callback])
:删除一个文档
参数:
conditions:条件
callback:回调函数
1
2
3
4
5
stuModel.remove({ name: "LiLy" }, (err) => {
if (!err) {
console.log("删除成功");
}
});
五、其他
1. Model.count(conditions, [callback])
:统计文档数量
参数:
conditions:条件
callback:回调函数
1
2
3
4
5
stuModel.count({}, (err, count) => {
if (!err) {
console.log(count);
}
});
Document 对象的方法
Document 和集合中的文档一一对应,Document 是 Model 的实例,通过 Model 查询到结果都是 Document
创建一个 Document
1
2
3
4
5
6
var stu = new stuModel({
name: "Amy",
age: "21",
gender: "female",
address: "GuangZhou",
});
1.save([callback])
:保存文档
1
2
3
4
5
stu.save((err) => {
if (!err) {
console.log("保存成功");
}
});
2.update(update, [options], [callback])
:修改文档
3.remove([callback])
:删除文档
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//修改和删除例子
stuModel.findOne({}, (err, doc) => {
if (!err) {
doc.update({ $set: { age: 100 } }, (err) => {
//修改
if (!err) {
console.log("修改成功");
}
});
doc.remove((err) => {
//删除
if (!err) {
console.log("删除成功");
}
});
}
});
4.toJson()
:将 Document 对象转换为普通的 JSON 对象
5.toObject()
:将 Document 对象转换为普通的 JS 对象,注意:转换为普通的 JS 对象以后,所有的 Document 对象的方法或属性都不能使用