这是mongodb数据库入门系列的最后一篇,关于mongodb高级查询aggregate聚合管道使用方法的一些总结,还有数据的备份导出和还原导入的总结,想看CRUD功能和索引、用户权限的可以查看我的第一篇和第二篇文章。
1、聚合管道(aggregate)
聚合管道我个人理解其实就是对数据库表里面的数据进行一系列(多个)操作(比如根据某些条件进行过滤,分组、数量的统计等等),主要用于表的关联查询、数据的统计。
常用的管道操作符:
$project:查询指定字段
$match:条件匹配,满足条件进入下一阶段
$limit:限制结果的数量,可以和$skip一起使用用于实现分页
$skip:跳过数据的数量,可以和$limit一起使用用于实现分页
$sort:条件排序
$group:分组统计,常常和$sum一起使用
$lookup:$lookup操作符,用来引入其他集合的数据,表的关联查询
聚合的一些表达式:
$sum:求和
$avg:求平均值
$min:获取最小值
$max:获取最大值
$push:数组中插入值
$first:获取第一个
$last:获取最后一个
用法演示:
首先创建两个有一些关联关系的表 通过order_id一对多关联,order和order_item,就是一个订单表和要给订单详情类似,数据字段如下:
可以看出来我们的order_item前三条数据订单1的,后两条属于订单2的。
$project:查找order中的数据只需要展示 order_id 和 uid,在之前的文章里面中介绍过一种方法 db.order.find({}, { order_id: 1, uid: 1 }) 这样也可以实现,使用 $project实现:
db.order.aggregate([{ $project: { order_id: 1, uid: 1 } }]) // 聚合管道的结构就是 db.order.aggregate([ {}, {}, {} ])
$match:过滤文档,和 find() 中的过滤条件一样,例如分别接着上面的找出 uid 大于7的,还有 uid 小于 10的数据
db.order.aggregate([{ $project: { order_id: 1, uid: 1 } }, { $match: { uid: { $gt: 7 } } }])
$group:分组
db.order_item.aggregate([{ $group: { _id: '$order_id', total: { $sum: 1 } } }])
ps:其中的_id表示按照什么进行分组,'$order_id' 表示按照 order_id 分组,后面的把 num 进行相加进行统计数量,这里需要注意的就是 $ 符号的使用。
$sort:排序 1 正序,-1 倒序
db.order_item.aggregate([{ $project: { title: 1, price: 1 } }, { $match: { price: { $gte: 50 } } }, { $sort: { price: 1 } }]) // 查询 order_item 表,只展示title、price字段,过滤出price大于等于50的数据,并按正序排序
$limit:限制返回的数据数量
$skip:查询结果跳过几条之后返回
示例:对上面的操作结果基础上进行添加筛选条件
db.order_item.aggregate([{ $project: { title: 1, price: 1 } }, { $match: { price: { $gte: 50 } } }, { $sort: { price: -1 } }, { $limit: 2 }]) // 限制返回两条数据
db.order_item.aggregate([{ $project: { title: 1, price: 1 } }, { $match: { price: { $gte: 50 } } }, { $sort: { price: -1 } }, { $limit: 2 }, { $skip: 1 }]) // 在返回的两条数据基础上,跳过第一条数据只展示第二条
$lookup:关联表
我们关联 order 和 order_item 表返回这样的结构:
[{
order_id: '', // 从order表中获取
trade_no: '', // 从order表中获取
items: [
{
title: '', // 从对应的order_id的order_item表中获取
price: '' // 从对应的order_id的order_item表中获取
},
...
]
},
...]
语法:
db.order.aggregate([ // order 是关联表
{
$lookup: { // 固定结构写法
from: 'order_item', // order_item被关联表
localField: 'order_id', // 关联表的关联字段(id)
foreignField: 'order_id' // 被关联表的关联字段(id),和localField不一定一样
as: 'items' // 两个表关联查询之后把被关联的数据放到哪里
}
}
])
返回结果:
2、补充:数据库备份(导出)和还原(导入)
1、启动mongodb数据库
2、打开cmd 输入 mongodump -h 数据库IP地址 -d 想备份的数据库名称 -o 导出的路径
ps:这里有一个坑需要说明一下,我们呢下载得mongodb数据库可能缺少一些工具集,也就是会发现 mongodump 命令不是内部或外部命令,这个时候我们需要去官网下载
把下载得工具集文件里面bin下面的全部工具集放到mongodb安装位置得bin目录下面:
放到mongodb的bin目录下:
这次我们在执行导出就没问题了:现在c盘下面创建一个 db 的空文件夹,我们本地又要给 shop 数据库,我要将其导出到这个 db 文件夹中 (见下图)
mongodump -h 127.0.0.1:27017 -d shop -o C:\db
ps:这里在后来的操作中我发现了一个问题,我需要补充一点 就是我们导出的文件夹 最好不要创建在我们启动mongodb数据库的那个设置的--dbpath的保存data的文件里面,不然可能出现导出失败
导出后结果:
这样就完成了数据库的备份。
3、进行还原操作,先把 shop 数据库删除掉
4、 执行还原命令 mongorestore -h 数据库IP地址 -d 数据库名称(自己任意命名) 导入数据库的路径
mongorestore -h 127.0.0.1 -d shop C:\db\shop
ps:这里需要补充一点的是进行备份(导出)、导入(还原)操作的时候不能再我们连接mongodb的那个终端继续操作,数据库的ip地址我们加不加端口号都可以默认就是27017,需要使用 cmd 重新打开一个终端操作。
5、如果数据库有用户名和密码认证(不是超级管理员的时候)的时候的备份和还原:
mongodump -h 数据库IP地址 -d 想备份的数据库名称 -u 用户名 -p 密码 -o 导出的路径
mongorestore -h 数据库IP地址 -d 数据库名称(自己任意命名) 导入数据库的路径 -u 用户名 -p 密码
如图:
mongodb数据库的内容大体总结了这些,也当作是自己的一个笔记,如果后续还有关于mongodb的还会继续补充, 这篇的图片截图比较多,写的不好的或者有疑问的大家可以留言讨论