1. MongoDB 概述
为什么要使用数据库?
- 动态网站中的数据都是存储在数据库中的。
- 数据库可以用来持久存储客户端通过表单收集的用户信息。
- 数据库软件本身可以对数据库进行高效的管理。
什么是数据库?
数据库即存储数据的仓库,可以将数据进行有序地分门别类的存储。它是独立于语言之外的软件,可以通过 API 去操作它。
常见的数据库管理软件有:mysql、mongoDB、oracle 等。
这篇笔记主要学习的是什么?
MongoDB 数据库管理软件提供了整套用于数据库管理的 API 。结合这些 API 我们可以使用命令行工具对数据库中的数据进行增删改查等操作。也可以下载一款具有图形界面的软件对其进行操作。但是这些都是独立对数据库进行操作。要将数据库操作与浏览器应用的开发结合使用需要使用到 node.js 的第三方模块 mongoose ,因此这里只是简单了解 mongoose 模块的一些常用 API 。
2. 使用 MongoDB 前必须了解
数据库中包含哪些内容?
一个数据库管理软件中可以包含多个数据仓库(分别用于保存独立的数据),在每个数据仓库中可以包含多个数据集合(类似于 mysql 中的表 table ),每个数据集合中可以包含多条文档(集体的每条数据)。
- database :数据库,mongoDB 数据库软件中可以建立多个数据库。
- collection :集合,一组数据的集合,可以理解为 js 中一个包含多个对象的数组。
- document :文档,一条具体的数据,可以理解为 js 中的对象。
- field :字段,文档中的属性名,可以理解为 js 中的对象属性。
使用 MongoDB 前需要准备些什么?
官网下载安装 mongodb 数据库,在命令行中运行 net start mongoDB 启动数据库服务(注意必须以管理员的身份运行 Powershell)。进行相关的配置即可使用 mongodb 数据库。下载安装时可以根据需要同时安装官方提供的具有图形界面的管理软件 compass ,也可以下载 Studio 3T 等其他软件。使用 node.js 操作数据当然还必须使用 npm install mongoose 下载第三方模块 mongoose 。
node.js 程序操作数据库前数据库的连接。
使用 mongoose 提供的 connect() 方法即可连接数据库。连接上的 MongoDB 服务中如果正在使用的数据库不存在,不需要显式创建数据库,MongoDB 会自动创建。连接语法如下:
mongoose.connect('mongodb://localhost:27017/test')
.then(() => console.log('数据库连接成功'))
.catch(err => console.log('数据库连接失败', err));
3. MongoDB 增删改查操作
3.1 创建集合
创建集合分为两步,一是设定集合规则,二是创建集合。
// 使用mongoose.Schema构造函数创建集合规则
const userSchema = new mongoose.Schema({
name: String,
age: Number,
isPass: Boolean
});
// 使用model方法应用集合规则创建User集合,数据库中增加了users这个集合
const User = mongoose.model('User', userSchema);
3.2 创建文档
创建文档即向集合中插入数据,也分为两步:创建集合的实例,调用实例方法 save() 将数据保存在数据库相应的集合中。
// 创建集合实例
const user1 = new User({
name: 'TKOP_',
age: 18,
isPass: true
});
// 将实例数据保存到数据库中
user1.save();
但是创建文档使用的比较多的是集合的 create() 方法,可以利用回调函数对插入的结果进行处理。返回的是一个 promise 对象,所以也可以使用 then 和 catch 方法处理插入结果,语法如下:
User.create({name: 'TKOP_', age: 18, isPass: true}, (err, doc) => {
// 错误处理,出错则输出错误信息,成功插入则输出插入的文档
err ? console.log(err) : console.log(doc)
});
// 另一种方式
User.create({name: 'TKOP_', age: 18, isPass: true})
.then(doc => console.log(doc))
.catch(err => console.log(err))
3.3 批量向数据库中导入数据
需要将某 JSON 文件内的大量数据批量导入某数据库集合内时,可以在命令行中使用下面这个命令。
mongoimport -d 数据库名称 -c 集合名称 -file 要导入的数据文件
导入时如果报错没有这个命令,检查 mongodb 数据库的安装目录的 bin 目录是否已放入环境变量中,如果没有手动将其添加到环境变量中。
3.4 查询文档(集合方法)
- find() 方法:返回所有符合条件的文档的一个集合。
- findOne() 方法:返回符合条件的第一个文档,在匹配到一个符合条件的文档时即停止查询并返回结果。
// modelName.find(Conditions, field, options, callback)
// modelName.findOne(Condition, field, callback) field字段的值可0可1
筛选条件 | 描述 |
---|---|
$gt | 大于 |
$lt | 小于 |
$gte | 大于或等于 |
$lte | 小于或等于 |
$ne | 不等于 |
$in | 查询字段值等于某些值的文档 |
$or | 查询多个字段条件,只要满足其中一个即可 |
$exists | 查询是否具有某字段值的文档 |
游标的基本使用
limit() 方法指定查询文档数量的上限。
skip() 方法略过指定数量的匹配结果。
sort() 方法对查询结果数据进行排序操作,该函数的参数是一个或多个键值对,键表示需要排序的字段名,值代表排序的方向,1 是升序,-1 是降序。
3.5 删除文档(集合方法)
- findOneAndDelete():删除单个文档
- deleteMany():删除多个文档
3.6 更新文档(集合方法)
- updateOne() :更新单个
- updateMany() :更新多个
3.7 插入验证(mongoose 验证)
- required : true 必传字段
- minlength : 3 字符串最小长度为 3
- maxlength : 20 字符串最大长度为 20
- min : 2 最小值为 2
- max : 100 最大值为 100
- enum : [‘normal’, ‘VIP’, ‘SVIP’] 只有三个可选的值
- trim : true 去除字符串两边的空格
- validate : 其他自定义验证器
- default : 设置某个默认值
获取错误信息:error.errors[‘字段名称’].message
3.8 集合关联(联合查询)
通常不同集合的数据之间是有联系的,例如订单信息和用户存储在不同集合中,但是订单是由某个用户确认购买后建立的,要查询订单的所有信息包括用户的某些信息时,就必须使用联合查询。
- 使用用户 id 对集合进
行关联 - 使用 populate 方法进行关联集合查询
// 创建订单集合
const Order = mongoose.model('Order', new mongoose.Schema({
date: Date,
// ... 其他字段
userID: {type: mongoose.Schema.Types.ObjectId, ref: 'User'}
}));
// 联合查询语法
Order.find()
.populate('User')
.then((err, result) => console.log(result));