MongoDB
聚合管道(Aggregation Pipeline
)可以实现的功能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} } ])