aggregate()(聚合管道)
最后更新:2026-10-09
aggregate()(聚合管道)
aggregate()通过聚合管道对文档进行分组、计算、连接等多阶段处理,例如`db.users.aggregate([{ $group: { _id: '$city', total: { $sum: 1 } } }])`。管道按顺序执行$match、$group、$sort、$project等阶段,数据逐级变换。它比find()强大得多,是报表统计、数据透视的首选。管道执行在服务端,返回游标或内联结果。
| 分类 | 读取 |
|---|---|
| MongoDB 版本 | 1.0+ |
| 示例语言 | mongosh (Shell) |
📝 语法
db.<集合>.aggregate(<管道数组>, { allowDiskUse: <bool> })
⚙️ 参数
| 管道数组 | 聚合阶段对象数组,如[{$match: {...}}, {$group: {...}}]。 |
|---|---|
| allowDiskUse | 可选。true时允许将超过100MB内存的中间结果写盘。 |
返回值:包含聚合结果的游标;$out/$merge写结果到集合时返回空游标。
▶ 示例
请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):
// aggregate:按城市分组统计用户数量
const result = db.users.aggregate([
{ $group: { _id: '$address.city', total: { $sum: 1 } } },
{ $sort: { total: -1 } }
])
result.toArray()
运行结果:
[
{ _id: 'Beijing', total: 12 },
{ _id: 'Shanghai', total: 8 }
]
📌 注意事项
- 管道阶段顺序影响结果,$match尽量前置以尽早过滤
- 默认单阶段内存限制100MB,超出需allowDiskUse: true
- $group的_id字段里引用原字段要用$前缀,如'$age'
🏷️ 相关标签
💡 相关案例
📚 相关教程
❓ 常见问题
Qaggregate和find有什么区别?
Afind()只能查询和投影;aggregate()还能分组、计数、求和、连表,适合统计报表场景。
Q聚合结果超过内存限制怎么办?
A传入{allowDiskUse: true}允许中间结果写磁盘,或优化管道尽早用$match过滤数据。
Q聚合的结果怎么取?
A聚合返回游标,可调用.toArray()转数组或遍历;使用$out写回集合时返回空游标。