1.聚合管道作用
- 使用聚合管道可以对集合中的文档进行变换和组合,在实际项目中可以做
多表关联查询
、数据统计
等工作
2.聚合管道常见操作符
管道操作符 | 描述 |
---|
$project | 增加、删除、重命名字段 |
$match | 条件匹配、只满足条件的文档才能进入下一阶段 |
$limit | 限制结果数量 |
$skip | 跳过文档的数量 |
$sort | 条件排序 |
$group | 条件组合、统计结果 |
$lookup | $lookup操作符,用以引入其他集合的数据 (表关联) |
3.管道操作符与SQL关键字对比
SQL | NoSql |
---|
where | $match |
group by | $group |
having | $match |
select | $project |
order by | $sort |
limit | $limit |
sum() | $sum |
count() | $sum |
join | $lookup |
4.模拟数据
1.订单表
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})
2.订单商品表
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})
5.$project
1.作用
- 修改文档结构,可以用来重命名、增加、删除文档中的字段
2.需求
- 要求查找集合
order
中的数据,只返回文档中trade_no
和all_price
字段
db.order.aggregate(
[
{
$project: {trade_no: 1, all_price: 1}
}
]
)
6.$match
1.作用:
2.需求
- 要求查找集合
order
中的数据,只返回文档中trade_no
和all_price
字段,且过滤掉all_price
小于90的数据
db.order.aggregate(
[
{
$project: {trade_no: 1, all_price: 1}
},
{
$match: {"all_price": {$gte: 90}}
}
]
)
7.$group
1.作用
2.需求
db.order_item.aggregate(
[
{
$group: {_id: "$order_id", total: {$sum: "$num"}}
}
]
)
8.$sort
1.作用
2.需求
- 要求查找集合
order
中的数据,只返回文档中trade_no
和all_price
字段,且过滤掉all_price
小于90的数据,最后按照all_price
进行降序排序
db.order.aggregate(
[
{
$project: {trade_no: 1, all_price: 1}
},
{
$match: {"all_price": {$gte: 90}}
},
{
$sort: {"all_price": -1}
}
]
)
9.$limit
1.作用
2.需求
- 要求查找集合
order
中的数据,只返回文档中trade_no
和all_price
字段,且过滤掉all_price
小于90的数据,最后按照all_price
进行降序排序,返回第一条数据
db.order.aggregate(
[
{
$project: {trade_no: 1, all_price: 1}
},
{
$match: {"all_price": {$gte: 90}}
},
{
$sort: {"all_price": -1}
},
{
$limit: 1
}
]
)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
10.$skip
1.作用
2.需求
- 要求查找集合
order
中的数据,只返回文档中trade_no
和all_price
字段,且过滤掉all_price
小于90的数据,最后按照all_price
进行降序排序,跳过第一条数据后返回第一条数据
db.order.aggregate(
[
{
$project: {trade_no: 1, all_price: 1}
},
{
$match: {"all_price": {$gte: 90}}
},
{
$sort: {"all_price": -1}
},
{
$skip: 1
},
{
$limit: 1
}
]
)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
11.lookup
1.作用
2.需求
db.order.aggregate([
{
$lookup: {
from: "order_item",
localField: "order_id",
foreignField: "order_id",
as: "items"
}
}
])
- 订单信息只显示
order_id
和all_price
字段
db.order.aggregate([
{
$project: {order_id: 1, all_price: 1}
},
{
$lookup: {
from: "order_item",
localField: "order_id",
foreignField: "order_id",
as: "items"
}
}
])
- 订单信息只显示
order_id
和all_price
字段,订单内商品只显示title
、price
、num
db.order.aggregate([
{
$lookup: {
from: "order_item",
localField: "order_id",
foreignField: "order_id",
as: "items"
}
},
{
$project: {
order_id: 1,
all_price: 1,
items: {
title: 1,
price: 1,
num: 1
}
}
}
])
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 过滤出订单内商品价格大于等于10元的数据:
$filter
db.order.aggregate([
{
$lookup: {
from: "order_item",
localField: "order_id",
foreignField: "order_id",
as: "items"
}
},
{
$project: {
order_id: 1,
all_price: 1,
items: {
"$filter": {
input: "$items",
as: "shop",
cond: {
$gte: [
"$$shop.price",
10
]
}
}
}
}
}
])
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28