mongoose基础
# mongoose
# 基本使用
# nodeJS 安装模块
npm install mongoose
1
# 连接数据库
var mongoose = require('mongoose')
mongoose.set('useCreateIndex', true) // 设置这个,解决运行时的警告
const DB_NAME = 'myblog' // 数据库名
const DB_URL = 'localhost:27017' // 数据库连接的地址 // 开始连接数据库 connect()返回一个状态待定(pending)的连接
mongoose.connect(`mongodb://${DB_URL}/${DB_NAME}`, {
useNewUrlParser: true,
useUnifiedTopology: true,
})
var db = mongoose.connection // 返回数据库 // 监听连接状态
db.once('open', (err) => {
// 监听数据库的打开
// we're connected!
if (!err) {
resolve()
console.log('数据库连接成功')
} else {
reject(err)
console.log(err)
}
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 创建实例
# 第一步
var mongoose = require('mongoose')
var Schema = mongoose.Schema
// 创建一个约束对象实例 (第一步)
var userSchema = new Schema({
u_id: {
type: String, // 学号类型为字符串
required: true, // 限制该项为必填项
unique: true, // 限制学号是唯一的
},
u_name: {
type: String,
required: true,
},
u_info: {
type: Schema.Types.Mixed, // 接收所有数据类型
},
u_data: {
type: Date,
default: Date.now(),
},
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 第二步
// 第一个参数与数据库中的集合相对应,第二个参数指定的是约束对象实例 (第二步)
var studentsModel = mongoose.model('user', userSchema)
1
2
2
# 第三步
// 创建一个Promise实例,用于管理数据库连接
let dbPromise = new Promise((resolve, reject) => {
// 开始连接数据库 connect()返回一个状态待定(pending)的连接(第三步 )
// mongoose.connect(base_url); // 该方法将要被抛弃
mongoose.connect(`mongodb://${DB_URL}/${DB_NAME}`, {
useNewUrlParser: true,
useUnifiedTopology: true,
}) // 开始连接数据库 connect()返回一个状态待定(pending)的连接(第三步)使用新的连接方式
var db = mongoose.connection // 返回数据库(第三步) // 监听连接状态
db.once('open', (err) => {
// 监听数据库的打开
// we're connected!
if (!err) {
resolve()
console.log('数据库连接成功')
} else {
reject(err)
console.log(err)
}
})
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 第四步
// 第一种
// myPromise.then(() => {
// }, err => {
// })
// 第二种方法
// myPromise.then(() => {
// }).catch(err => {
// })
// 第三种
;(async () => {
// 等待数据库连接成功
await dbPromise // 操作数据库的代码 // ...
console.log(1)
})()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# CRUD 操作
# 条件
确保上面的基本使用到了第四步
【结构】如下:
;(async () => {
// 等待数据库连接成功
await dbPromise // 操作数据库的代码 // 增 // studentsModel.create({ // id: 1, // name: '张三', // avatar: '这是一个头像', // age: 12, // info: '拼命努力吧' // }, (err, data) => { // if (!err) { // console.log('数据插入成功', data); // } else { // console.log(err) // } // }) // 删
studentsModel.deleteOne({}) // 改
studentsModel.update(
{
age: 12,
},
{
name: 'lisi',
},
(err, data) => {
if (!err) {
console.log('数据修改成功', data)
} else {
console.log(err)
}
}
) // 查
studentsModel.find(
{
age: 12,
},
(err, data) => {
if (!err) {
console.log('数据查询成功', data)
} else {
console.log(err)
}
}
)
})()
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
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
# 备注:以下所有方法,如果没有指定回调函数,则返回值是一个 promise 对象,没有回调函数,部分内容会不干活,也就是不报错,但是没有执行删除等操作
# 增
# 模型对象.create(文档对象,回调函数)
studentsModel.create(
{
id: 1,
name: '张三',
avatar: '这是一个头像',
age: 12,
info: '拼命努力吧',
},
(err, data) => {
if (!err) {
console.log('数据插入成功', data)
} else {
console.log(err)
}
}
)
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
# 模型对象.create(文档对象)
studentsModel.create({
id: 1,
name: '张三',
avatar: '这是一个头像',
age: 12,
info: '拼命努力吧',
})
1
2
3
4
5
6
7
2
3
4
5
6
7
# 删
# 模型对象.deleteOne(查询条件)
studentsModel.deleteOne({})
1
# 模型对象.deleteMany(查询条件)
studentsModel.deleteMany({
age: 20,
})
1
2
3
2
3
【备注】:没有 delete 方法,会报错
# 改
# 模型对象.updateOne(查询条件,要更新的内容[,配置对象])
- 第一种方法:
studentsModel.updateOne(
{
age: 12,
},
{
name: 'lisi',
},
(err, data) => {
if (!err) {
console.log('数据修改成功', data)
} else {
console.log(err)
}
}
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- 第二种方法:
let selectStudents = await studentsModel.updateOne({ age: 12 })
1
# 模型对象.updateMany(查询条件,要更新的内容[,配置对象])
studentsModel.updateMany(
{
age: 12,
},
{
sex: '男',
},
(err, data) => {
if (!err) {
console.log('数据修改成功', data)
} else {
console.log(err)
}
}
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
【备注】:存在 update 方法,但是即将废弃,查询条件匹配到多个时,依然只修改一个,强烈建议用 updateOne
# 查
# 模型对象.find(查询条件[,投影])
不管有没有数据,都返回一个数组
studentsModel.find(
{
age: 12,
},
(err, data) => {
if (!err) {
console.log('数据查询成功', data)
} else {
console.log(err)
}
}
)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 模型对象.findOne(查询条件[,投影])
找到了返回一个对象,没找到返回 null
studentsModel.findOne(
{
age: 12,
},
(err, data) => {
if (!err) {
console.log('数据查询成功', data)
} else {
console.log(err)
}
}
)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 连接数据库警告的解决
# { useNewUrlParser: true }
1.警告提示
(node:19040) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
1
- 解决方法
// 在这一句的后面再加一个对象
mongoose.connect(`mongodb://${DB_URL}:${DB_PORT}/${DB_NAME}`)
// 改成下面这样,这条警告就没有了
mongoose.connect(`mongodb://${DB_URL}:${DB_PORT}/${DB_NAME}`, {
useNewUrlParser: true,
})
1
2
3
4
5
6
2
3
4
5
6
# { useUnifiedTopology: true }
- 警告提示
(node:19380) DeprecationWarning: current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the
new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.
1
2
2
- 解决方法
// 继续在这一条后面添加
mongoose.connect(`mongodb://${DB_URL}:${DB_PORT}/${DB_NAME}`, {
useNewUrlParser: true,
})
// 改成下面这样,这条警告就没有了
mongoose.connect(`mongodb://${DB_URL}:${DB_PORT}/${DB_NAME}`, {
useNewUrlParser: true,
useUnifiedTopology: true,
})
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
上次更新: 2021/09/13, 15:11:59