如果普通查询是在“找档案”,那聚合就是“把档案送上加工流水线”。
MongoDB 的聚合管道像这样工作:
原始文档
|
v
$match 先筛选
|
v
$project 只保留需要字段
|
v
$unwind 拆开数组
|
v
$group 分组统计
|
v
$sort 排序
|
v
结果输出假设要统计每个商品卖了多少件:
db.orders.aggregate([
{ $match: { status: "paid" } },
{ $unwind: "$items" },
{
$group: {
_id: "$items.sku",
totalQty: { $sum: "$items.qty" },
totalRevenue: { $sum: { $multiply: ["$items.qty", "$items.price"] } }
}
},
{ $sort: { totalQty: -1 } }
])这条流水线在做的事:
- 先只拿已支付订单
- 把每张订单里的
items一件件拆开 - 按
sku分组 - 求销量和销售额
- 按销量倒序排列
如果你需要把引用的数据拼回来,可以用 $lookup:
db.orders.aggregate([
{
$lookup: {
from: "users",
localField: "userId",
foreignField: "_id",
as: "userInfo"
}
}
])注意一个认知点:
- 聚合管道通常是“读并加工”
- 它默认不修改原文档
- 只有特定阶段才会把结果写出去
所以你可以把聚合理解为“档案分析工厂”,而不是“改档工具”。