mongoose
更新时间: 2024-11-13 16:42:48
# mongoose介绍
Mongoose是一个对象文档模型库。方便使用代码操作mongodb数据库
# 使用流程
// 1. 安装mongoose npm i mongoose
// 2. 导入 mongoose
const mongoose = require('mongoose')
// 3. 连接 mongodb 服务
mongoose.connect('mongodb://127.0.0.1:27017/bilibili')
// 4. 设置回调
// 设置连接成功的回调
mongoose.connection.on('open', () => {
console.log('连接成功')
// 5. 创建文档的结构对象
// 设置集合中文档的属性以及属性值的类
let BookSchema = new mongoose.Schema({
name: String,
author: String,
price: Number
})
// 6. 创建模型对象 对文档操作封装对象
let BookModel = mongoose.model('books', BookSchema)
// 7. 新增
BookModel.create({
name: '西游记',
author: '吴承恩',
price: 19.9
}).then((err, data) => {
// 判断是否有错误
if(err) {
console.log(err)
return
}
// 如果没有出错,则输出插入后的文档对象
console.log(data)
// 8. 关闭数据库连接(项目运行过程中,不会添加该代码)
mongoose.disconnect()
})
})
// 设置连接错误的回调
mongoose.connection.on('error',() => {
console.log('连接失败')
})
// 设置连接关闭的回调
mongoose.connection.on('close',() => {
console.log('连接关闭')
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 字段类型
文档结构可选的常用字段类型列表
类型 | 描述 |
---|---|
String | 字符串 |
Number | 数字 |
Boolean | 布尔值 |
Array | 数组,也可以用[]来标识 |
Date | 日期 |
Buffer | Buffer对象 |
Mixed | 任意类型,需要使用mongoose.Schema.Types.Mixed指定 |
ObjectId | 对象ID,需要使用mongoose.Schema.Types.ObjectId指定 |
Decimal28 | 高精度数字,需要使用mongoose.Schema.Types.Dicimal128 |
# 字段值验证
Mongoose有一些内建验证器,可以对字段值进行验证
# 必填项
title: {
type: String,
required: true // 设置必填项
}
1
2
3
4
2
3
4
# 默认值
author: {
type: String,
default: '匿名' // 默认值
}
1
2
3
4
2
3
4
# 枚举值
gender :{
type: String,
enum: ['男', '女'] // 设置的值必须是数组中的
}
1
2
3
4
2
3
4
# 唯一值
username: {
type: String,
unique: true
}
1
2
3
4
2
3
4
注意
- unique需要重建集合才能有效果
- 永远不要相信用户的输入
# 插入
BookModel.create({
name: '西游记',
author: '吴承恩',
price: 19.9
}).then((err, data) => {
// 判断是否有错误
if(err) {
console.log(err)
return
}
// 如果没有出错,则输出插入后的文档对象
console.log(data)
// 8. 关闭数据库连接(项目运行过程中,不会添加该代码)
mongoose.disconnect()
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
BookModel.insertMany([{
name: '西游记',
author: '吴承恩',
price: 19.9,
is_hot: true
},
{
name: '狂飙',
author: '徐纪周',
price: 68,
is_hot: true
}, {
name: '大魏能臣',
author: '黑男爵',
price: 9.9,
is_hot: false
},
{
name: '知北游',
author: '洛水',
price: 59,
is_hot: false
},
{
name: '百年孤独',
author: '范晔',
price: 39.5,
is_hot: true
},
{
name: '在细雨中呼喊',
author: '余华',
price: 25,
is_hot: true
},]).then((err, data) => {
//判断是否有错误
if (err) {
console.log(err);
return;
}
//如果没有出错, 则输出插入后的文档对象
console.log(data);
//8. 关闭数据库连接 (项目运行过程中, 不会添加该代码)
mongoose.disconnect();
});
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 删除文档
// 7. 删除一条
BookModel.deleteOne({_id:'6735744bbf61c5175adbf0ca'}).then((data) => {
console.log(data)
})
// 批量删除
BookModel.deleteMany({is_hot:false}).then((data) => {
console.log(data)
})
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 更新文档
// 更新文档 更新一条
BookModel.updateOne({name:'红楼梦'},{price:9.9}).then((data) => {
console.log(data)
})
// 批量更新
BookModel.updateMany({author:'余华'},{is_hot:true}).then((data) => {
console.log(data)
})
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 读取文档
// 读取单条
BookModel.findOne({name:'狂飙'}).then((data) => {
console.log(data)
})
// 根据ID获取文档
BookModel.findById('6735744bbf61c5175adbf0cf').then((data) => {
console.log(data)
})
// 批量获取
BookModel.find({author: '余华'}).then((data) => {
console.log(data)
})
BookModel.find().then((data) => {
console.log(data)
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 条件控制
# 运算符
在mongodb不能><>=<=!==等运算符,需要使用代替符号
- > 使用 $gt
- < 使用 $lt
- >= 使用 $gte
- <= 使用 $lte
- !== 使用 $ne
// 价格小于20的图书
BookModel.find({price: {$lt: 20}}).then(data => {
console.log(data)
})
1
2
3
4
2
3
4
# 逻辑运算
$or 逻辑或的情况
// 曹雪芹 或者 余华的书
BookModel.find({$or:[{author:'曹雪芹'},{author:'余华'}]}).then(res => {
console.log(res)
})
1
2
3
4
2
3
4
$and 逻辑与的情况
// 价格大于30且小于70
BookModel.find({$and:[{price:{$gt:30}},{price:{$lt:70}}]}).then(res => {
console.log(res)
})
1
2
3
4
2
3
4
正则匹配
条件中可以直接使用JS的正则语法,通过正则可以进行模糊查询
// 正则表达式,搜索书籍名称中带有三的图书
BookModel.find({name:/三/}).then(res => {
console.log(res)
})
1
2
3
4
2
3
4
# 个性化读取
# 字段筛选
// 0. 不要的字段
// 1. 要的字段
// 设置字段
BookModel.find().select({_id:0, name:1, author:1}).then((data) => {
console.log(data)
})
1
2
3
4
5
6
2
3
4
5
6
# 数据排序
// sort 排序
// 1:升序
//-1: 倒序
// 数据排序
BookModel.find().sort({price:1}).then(res => {
console.log(res)
})
1
2
3
4
5
6
7
2
3
4
5
6
7
# 数据截取
// skip 跳过 limit 限定
// 数据的截取 取4-6位
BookModel.find().select({name:1,price:1,_id:0}).sort({price: -1}).skip(3).limit(3).then(res => {
console.log(res)
})
1
2
3
4
5
2
3
4
5
# Mongodb图形化工具 Robo3T
免费 https://github.com/Studio3T/robomongo/releases (opens new window)
# Mongodb图形化工具 Navicat
收费 https://www.navicat.com.cn/ (opens new window)
# 官方图形化工具 Compass
https://www.mongodb.com/try/download/compass (opens new window)