MongoDB聚合管道简介
- 使用聚合管道可以对集合中的文档进行变换和组合
- 实际项目:多表关联查询、数据的统计
- MongoDB中使用 db.COLLECTION_NAME.aggregate([{},...])方法来构建和使用聚合管道

MongoDB 管道操作符与表达式
管道操作符 | 简介 |
---|---|
$project | 筛选文档中指定的字段 |
$match | 传递指定条件过滤满足条件的文档 |
$limit | 获取指定数量的文档 |
$skip | 跳过指定数量的文档 |
$sort | 对集合中的文档进行排序 |
$group | 对集合中的文档进行分组,可用于统计结果。 |
$lookup | $lookup操作符用以引入其它集合的数据(用作多表关联查询) |
订单数据模拟
db.order.insert({"order_id":"1","uid":10,"trade_no":"111","total_price":200,"total_number":2})
db.order.insert({"order_id":"2","uid":7,"trade_no":"222","total_price":70,"total_number":2})
db.order.insert({"order_id":"3","uid":9,"trade_no":"333","total_price":120,"total_number":6})
db.order_item.insert({"order_id":"1","title":"蛇灵键盘","price":50,number:1})
db.order_item.insert({"order_id":"1","title":"鼠标","price":50,number:1})
db.order_item.insert({"order_id":"1","title":"Usb转换器","price":0,number:1})
db.order_item.insert({"order_id":"2","title":"三只松鼠小礼包","price":50,number:1})
db.order_item.insert({"order_id":"2","title":"原味辣条","price":40,number:1})
db.order_item.insert({"order_id":"3","title":"矿泉水","price":2,number:5})
db.order_item.insert({"order_id":"3","title":"牙刷","price":10,number:1})
$project
筛选文档中指定的字段
db.order.aggregate([
{
$project:{ trade_no:1, total_price:1 }
}
])
$match
传递指定条件过滤满足条件的文档
db.order.aggregate([
{
$project:{ trade_no:1, total_price:1 }
},
{
$match:{"total_price":{$gte:90}}
}
])
$group
对集合中的文档进行分组,可用于统计结果。例如:按照订单号分组,统计每个订单的购买的商品总量
db.order_item.aggregate(
[
{
$group: {_id: "$order_id", total: {$sum: "$number"}}
}
])
分组后聚合操作求和
db.order_item.aggregate(
[
{
$group: {_id: "$order_id", total: {$sum: "$price"}}
}
])
$sort
对集合中的文档进行排序
db.order.aggregate([
{
$project:{ trade_no:1, total_price:1 }
},
{
$match:{"total_price":{$gte:90}}
},
{
$sort:{"total_price":-1}
}
])
$limit
获取指定数量的文档
db.order.aggregate([
{
$project:{ trade_no:1, total_price:1 }
},
{
$match:{"total_price":{$gte:90}}
},
{
$sort:{"total_price":-1}
},
{
$limit:1
}
])
$skip
跳过指定数量的文档
db.order.aggregate([
{
$project:{ trade_no:1, total_price:1 }
},
{
$match:{"total_price":{$gte:90}}
},
{
$sort:{"total_price":-1}
},
{
$skip:1
}
])
$lookup表关联
$lookup操作符用以引入其它集合的数据(用作多表关联查询)
db.order.aggregate([
{
$lookup:
{
from: "order_item",
localField: "order_id",
foreignField: "order_id",
as: "itemInfo"
}
}
])