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