一、使用MongoDB
聚合管道(Aggregation Pipeline
)可以实现的功能
- 1、使用聚合管道可以对集合中的文档进行变换和组合。
- 2、实际项目:表关联查询、数据的统计。
二、聚合管道的使用方式
-
1、使用方式
db.collection_name[表名].aggregate([{}, {},....])
-
2、使用的效果展示
三、基本的命令集合
-
1、
mongodb aggregation
管道操作符和表达式No 管道操作符 描素 1 $project
增加、删除、重命名字段(查询的字段) 2 $match
条件匹配查询,只有符和条件的数据才能查询出来 3 $limit
限制结果的数量 4 $skip
跳过文档的数量 5 $sort
排序 6 $group
根据条件分组 7 $lookup
用来引入别的集合(多表查询) 关于
$lookup
的几个参数介绍NO 字段 描素 1 from
同一个数据库下等待被 Join
的集合2 localField
源集合中的 match
值,如果输入的集合中,某文档没有localField
这个Key(Field)
,在处理的过程中,会默认为此文档含有localField:null
的键值对。3 foreignField
待 Join
的集合的match
值,如果待Join
的集合中,文档没有foreignField
值,在处理的过程中,会默认为此文档含有foreignField:null
的键值对。4 as
为输出文档的新增值命名。如果输入的集合中已存在该值,则会覆盖掉 -
2、
mongodb
中与mysql
中的对比No mysql
mongodb
描素 1 where
$match
查询条件 2 group by
$group
分组查询 3 having
$match
查询条件 4 order by
$sort
排序 5 limit
$limit
限制 6 sum
$sum
求和 7 count
$sum
计数 8 join
$lookup
表关联 9 select
$project
选择字段 -
3、管道表达式
-
管道操作符作为"键",所对应的“值”叫做管道表达式
-
{$match:{status:"A"}},$match
称为管道操作符,而status:"A"
称为管道表达式, 是管道操作符的操作数(Operand
) -
常见的管道表达式操作符
No 表达式操作符 描素 1 $addToSet
将稳定指定字段的值去重 2 $max
文档指定字段的最大值 3 $min
文档指定字段的最小值 4 $sum
文档指定字段求和 5 $avg
文档指定字段求平均值 6 $gt
大于给定的值 7 $lt
小于给定的值 8 $eq
等于给定的值 9 gte
大于等于给定的值 10 lte
小于等于给定的值
-
四、数据操作
-
1、登录数据库并且创建数据库
# 登录数据库 mongo # 查看全部的数据库 show dbs # 使用哪个数据库【如果当前没这个数据可以就是创建,之前有就是使用。如果是创建必须先插入一条数据使用show dbs才可以看到】 use 数据库名 # 查看当前使用的是哪个数据库 db
-
2、模拟数据插入到
mongodb
中-- 订单 db.order.insert({"order_id":"1","uid":10,"trade_no":"111","all_price":100,"all_num":2}) db.order.insert({"order_id":"2","uid":7,"trade_no":"222","all_price":90,"all_num":2}) db.order.insert({"order_id":"3","uid":9,"trade_no":"333","all_price":20,"all_num":6}) -- 订单列表 db.order_item.insert({"order_id":"1","title":"商品鼠标 1","price":50,num:1}) db.order_item.insert({"order_id":"1","title":"商品键盘 2","price":50,num:1}) db.order_item.insert({"order_id":"1","title":"商品键盘 3","price":0,num:1}) db.order_item.insert({"order_id":"2","title":"牛奶","price":50,num:1}) db.order_item.insert({"order_id":"2","title":"酸奶","price":40,num:1}) db.order_item.insert({"order_id":"3","title":"矿泉水","price":2,num:5}) db.order_item.insert({"order_id":"3","title":"毛巾","price":10,num:1})
-
3、
$project
只查询出想要的字段-- db.order.aggregate([]) db.getCollection('order').aggregate([ { $project: {trade_no:1,all_price:1} -- 表示只查询出trade_no和all_price字段 } ])
-
4、
$match
过滤数据db.getCollection('order').aggregate([ { $project: {trade_no:1,all_price:1} }, { -- 对上面查询的结果进行过滤,只查询出价格大于等于90的 $match: {all_price: {$gte: 90}} } ])
-
5、
$group
分组查询db.order_item.aggregate([ { -- 根据order_id字段来分组求和,求和字段是$num $group: {_id: "$order_id", total: {$sum: "$num"}} } ])
-
6、
$sort
排序db.order.aggregate([ { $project: {order_id: 1, all_price: 1} }, { $match: {all_price: {$gte: 90}} }, { -- -1表示降序,1表示升序 $sort: {all_price: -1} } ])
-
7、
$limit
表示限制返回多少条db.order.aggregate([ { $project: {order_id: 1, all_price: 1} }, { $match: {all_price: {$gte: 90}} }, { $sort: {all_price: -1} }, { $limit: 1 } ])
-
8、
$skip
跳过多少条(从多少条数据开始)db.order.aggregate([ { $project: {order_id: 1, all_price: 1} }, { $match: {all_price: {$gte: 90}} }, { $sort: {all_price: -1} }, { $limit: 1 }, { $skip: 1 } ])
-
9、
$lookup
关联查询db.order.aggregate([ { $lookup: { from: "order_item", localField: "order_id", foreignField: "order_id", as: "item" } } ])
db.order.aggregate([ { $match: {all_price: {$gte: 90}} }, { $lookup: { from: "order_item", localField: "order_id", foreignField: "order_id", as: "item", } } ])
db.order.aggregate([ { $match: {all_price: {$gte: 90}} }, { $lookup: { from: "order_item", localField: "order_id", foreignField: "order_id", as: "item", } }, { -- 需要显示的字段 $project: {"all_price": 1, "all_num": 1, "item.title": 1} } ])