1 创建数据

1.1 连接数据库

1
2
3
4
5
6
7
8
9
10
11
// 引入mongoose第三方模块 用来操作数据库
const mongoose = require('mongoose')
// 数据库连接
mongoose
.connect('mongodb://用户名:密码@主机:端口/数据库名', {
useNewUrlParser: true,
})
// 连接成功
.then(() => console.log('数据库连接成功'))
// 连接失败
.catch((err) => console.log(err, '数据库连接失败'))

1.2 创建集合

1
2
3
4
5
6
7
8
9
10
// 创建集合规则
const userSchema = new mongoose.Schema({
name: String,
age: String,
})

// 使用规则创建集合
// 1.集合名称
// 2.集合规则
const User = mongoose.model('User', userSchema) // courses

1.3 创建文档

方式一,实例化:

1
2
3
4
5
6
7
// 创建文档
const user = new User({
name: 'Tom',
age: '22',
})
// 将文档插入到数据库中
user.save()

方式二,creat 函数(异步):

1
2
3
4
// 向User集合中插入文档
User.create({ name: 'Sam', age: '23' }).then((result) => {
console.log(result)
})

1
2
3
4
5
// 向User集合中插入文档
User.create({ name: 'Alice', age: '21' }, (err, result) => {
console.log(err)
console.log(result)
})

1.4 导入数据

命令行输入:

1
mongoimport –d 数据库名称 –c 集合名称 –-file 要导入的数据文件

mongoimport 在 mongodb 安装目录下

2 文档查删改

2.1 文档查找

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
49
50
51
52
53
54
55
56
// 查询用户集合中的所有文档
User.find().then((result) => console.log(result))

// 滤掉 name 中的相同数据
User.distinct('name').then((result) => console.log(result))

// 查询 name 中包含'张'的数据
User.find({ name: /张/ }).then((result) => console.log(result))

// 查询 name = '张三', age = 20 的数据
User.find({ name: '张三', age: 20 }).then((result) => console.log(result))

// 查询 age = 20 或 age = 32 的数据
User.find({ $or: [{ age: 20 }, { age: 32 }] }).then((result) =>
console.log(result)
)

// 通过_id字段查找文档
User.find({ _id: '5c09f267aeb04b22f8460968' }).then((result) =>
console.log(result)
)

// findOne方法返回一条文档 默认返回当前集合中的第一条文档
User.findOne({ name: '李四' }).then((result) => console.log(result))

// 查询用户集合中年龄字段大于20并且小于等于40的文档
User.find({ age: { $gt: 20, $lte: 40 } }).then((result) => console.log(result))

// 查询用户集合中hobbies字段值包含足球的文档
User.find({ hobbies: { $in: ['足球'] } }).then((result) => console.log(result))

// 选择要查询的字段
User.find()
.select('name email -_id')
.then((result) => console.log(result))

// 根据年龄字段进行升序排列
User.find()
.sort('age')
.then((result) => console.log(result))

// 根据年龄字段进行降序排列
User.find()
.sort('-age')
.then((result) => console.log(result))

// 查询年龄小于25岁的文档数量
User.find({ age: { $gte: 25 } })
.count()
.then((result) => console.log(result))

// 查询文档跳过前两条结果 限制显示3条结果
User.find()
.skip(2)
.limit(3)
.then((result) => console.log(result))

2.2 文档删除

1
2
3
4
5
6
7
8
9
// 查找到一条文档并且删除
// 返回删除的文档
// 如何查询条件匹配了多个文档 那么将会删除第一个匹配的文档
User.findOneAndDelete({ _id: '5c09f267aeb04b22f8460968' }).then((result) =>
console.log(result)
)

// 删除多条文档
User.deleteMany({}).then((result) => console.log(result))

2.3 文档更新

1
2
3
4
5
6
7
// 如果匹配了多条文档, 只会更新匹配成功的第一条文档
User.updateOne({ name: '李四' }, { age: 120, name: '李狗蛋' }).then((result) =>
console.log(result)
)

// 更新多条文档
User.updateMany({}, { age: 300 }).then((result) => console.log(result))

3 集合验证

验证字段:

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
const postSchema = new mongoose.Schema({
title: {
type: String,
// 必选字段
required: [true, '请传入文章标题'],
// 字符串的最小长度
minlength: [2, '文章长度不能小于2'],
// 字符串的最大长度
maxlength: [5, '文章长度最大不能超过5'],
// 去除字符串两边的空格
trim: true,
},
age: {
type: Number,
// 数字的最小范围
min: 18,
// 数字的最大范围
max: 100,
},
publishDate: {
type: Date,
// 默认值
default: Date.now,
},
category: {
type: String,
// 枚举 列举出当前字段可以拥有的值
enum: {
values: ['html', 'css', 'javascript', 'node.js'],
message: '分类名称要在一定的范围内才可以',
},
},
author: {
type: String,
validate: {
validator: (v) => {
// 返回布尔值
// true 验证成功
// false 验证失败
// v 要验证的值
return v && v.length > 4
},
// 自定义错误信息
message: '传入的值不符合验证规则',
},
},
})

错误捕捉:

1
2
3
4
5
6
7
8
9
10
11
12
13
const Post = mongoose.model('Post', postSchema)

Post.create({ title: 'aa', age: 60, category: 'java', author: 'bd' })
.then((result) => console.log(result))
.catch((error) => {
// 获取错误信息对象
const err = error.errors
// 循环错误信息对象
for (var attr in err) {
// 将错误信息打印到控制台中
console.log(err[attr]['message'])
}
})

4 集合关联

建立关联:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 用户集合规则
const userSchema = new mongoose.Schema({
name: {
type: String,
required: true,
},
})
// 文章集合规则
const postSchema = new mongoose.Schema({
title: {
type: String,
},
author: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
},
})

查询关联:

1
2
3
Post.find()
.populate('author')
.then((result) => console.log(result))