聚合(Aggregation)
Overview
在本指南中,您可了解如何在 MongoDB Node.js 驱动程序中使用聚合操作。
聚合操作是一种表达式,可用于在 MongoDB 中生成归约和汇总的结果。MongoDB 的聚合框架允许您创建一个由一个或多个阶段组成的管道,每个阶段可对您的数据执行特定的操作。
类比
您可将聚合管道近似理解为汽车工厂。工厂需将各种装配站组织成装配线,才能进行汽车制造。每个装配站均有专门的工具,例如钻头和焊机。工厂会改造初始零件和材料并组装为成品。
聚合管道是装配线,聚合阶段是装配站,操作符表达式则是专用工具。
聚合与查询操作
使用查询操作(例如 find()
方法),您可以执行以下操作:
选择要返回的文档
选择要返回哪些字段
对结果进行排序
通过使用聚合操作,可执行以下操作:
执行所有查询操作
重命名字段
计算字段
汇总数据
对值进行分组
聚合操作有一些限制:
返回的文档不得违反 16 兆字节的 BSON 文档大小限制。
默认情况下,管道阶段的内存限制为100 MB。 如有必要,您可以通过将
AggregateOptions
的allowDiskUse
属性设置为true
来超出此限制。 请参阅 AggregateOptions API 文档 了解更多详情。
重要
$graphLookup 异常
$graphLookup 阶段存在 100 兆字节的严格内存限制,且会忽略 allowDiskUse
。
实用参考资料
要了解有关聚合概念的详情,请参阅以下服务器手册中的页面:
可运行示例
该示例使用有关餐馆的样本数据。以下代码将数据插入到 aggregation
数据库的 restaurants
集合中:
const db = client.db("aggregation"); const coll = db.collection("restaurants"); const docs = [ { stars: 3, categories: ["Bakery", "Sandwiches"], name: "Rising Sun Bakery" }, { stars: 4, categories: ["Bakery", "Cafe", "Bar"], name: "Cafe au Late" }, { stars: 5, categories: ["Coffee", "Bakery"], name: "Liz's Coffee Bar" }, { stars: 3, categories: ["Steak", "Seafood"], name: "Oak Steakhouse" }, { stars: 4, categories: ["Bakery", "Dessert"], name: "Petit Cookie" }, ]; const result = await coll.insertMany(docs);
提示
有关连接 MongoDB 部署的更多信息,请参阅连接指南。
聚合示例
如需执行聚合,请向 collection.aggregate()
方法传递聚合阶段列表。
在示例中,aggregation pipeline 使用以下聚合阶段:
$match 阶段来过滤其
categories
数组字段包含Bakery
元素的文档。一个 $group 阶段,它可按
stars
字段对匹配的文档进行分组,从而为stars
的每个不同值累积文档数。
const pipeline = [ { $match: { categories: "Bakery" } }, { $group: { _id: "$stars", count: { $sum: 1 } } } ]; const aggCursor = coll.aggregate(pipeline); for await (const doc of aggCursor) { console.log(doc); }
此示例应生成以下输出:
{ _id: 4, count: 2 } { _id: 3, count: 1 } { _id: 5, count: 1 }
有关更多信息,请参阅aggregate() API 文档。
其他示例
要查看常见聚合任务的分步说明,请参阅聚合教程。
您可在 MongoDB 网站上的 Aggregation Framework with Node.js Tutorial 博客文章中找到另一聚合管道示例。