MongoDB 聚合管道
使用聚合管道可以对集合中的文档进行变换和组合
实际运用:表关联查询、数据的统计
MongoDB
中使用 db.COLLECTION_NAME.aggregate([{},...])
方法来构建和使用聚合管道
Aggregation Pipeline Stages & Operators
Stages 操作
操作符 S | 描述 |
---|---|
$project | 修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档 |
$match | 用于过滤数据,只输出符合条件的文档。$match 使用 MongoDB 的标准查询操作 |
$limit | 用来限制 MongoDB 聚合管道返回的文档数 |
$skip | 在聚合管道中跳过指定数量的文档,并返回余下的文档 |
$group | 将集合中的文档分组,可用于统计结果 |
$sort | 将输入文档排序后输出 |
$lookup | 用以引入其它集合的数据 (表关联查询) |
Operators 运算符
Operators | 描述 |
---|---|
$sum | 计算总和 |
$avg | 计算平均值 |
$min | 获取集合中所有文档对应值得最小值 |
$max | 获取集合中所有文档对应值得最大值 |
$push | 在结果文档中插入值到一个数组中 |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本 |
$first | 根据资源文档的排序获取第一个文档数据 |
$last | 根据资源文档的排序获取最后一个文档数据 |
管道操作符作为键,所对应的值叫做管道表达式 例如
{$match:{status:"A"}}
,$match
称为管道操作符,而status:"A"
称为管道表达式 每个管道表达式是一个文档结构,它是由字段名、字段值、和一些表达式操作符组成的
数据模拟
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})
$project
自定义文档的结构,可以用来重命名、增加或删除文档中的字段
查找 order 只返回文档中 trade_no 和 all_price 字段
db.order.aggregate([
{
$project: {
trade_no: 1,
all_price: 1
}
}
])
$match
过滤。用法类似于 find()
方法中的参数
db.order.aggregate([
{
$project: { trade_no: 1, all_price: 1 }
},
{
$match: { all_price: { $gte: 90 } }
}
])
$group
分组,可用于统计结果
db.order_item.aggregate([
{
$group: { _id: '$order_id', total: { $sum: '$num' } }
}
])
$sort
排序
db.order.aggregate([
{
$project: { trade_no: 1, all_price: 1 }
},
{
$sort: { all_price: -1 }
}
])
$limit
限制数量
db.order.aggregate([
{
$project: { trade_no: 1, all_price: 1 }
},
{
$limit: 1
}
])
$skip
跳过
db.order.aggregate([
{
$project: { trade_no: 1, all_price: 1 }
},
{
$skip: 1
}
])
$lookup
表关联
db.order.aggregate([
{
$lookup: {
from: 'order_item',
localField: 'order_id',
foreignField: 'order_id',
as: 'items'
}
}
])
综合运用
db.order.aggregate([
{
$lookup: {
from: 'order_item',
localField: 'order_id',
foreignField: 'order_id',
as: 'items'
}
},
{
$match: {
all_price: {
$gt: 90
}
}
},
{
$project: {
items: 1
}
}
])