一、使用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 mysqlmongodb描素 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} } ])