Docs 菜单
Docs 主页
/ / /
Node.js
/

聚合(Aggregation)

在此页面上

  • Overview
  • 类比
  • 聚合与查询操作
  • 实用参考资料
  • 可运行示例
  • 聚合示例
  • 其他示例

在本指南中,您可了解如何在 MongoDB Node.js 驱动程序中使用聚合操作

聚合操作是一种表达式,可用于在 MongoDB 中生成归约和汇总的结果。MongoDB 的聚合框架允许您创建一个由一个或多个阶段组成的管道,每个阶段可对您的数据执行特定的操作。

您可将聚合管道近似理解为汽车工厂。工厂需将各种装配站组织成装配线,才能进行汽车制造。每个装配站均有专门的工具,例如钻头和焊机。工厂会改造初始零件和材料并组装为成品。

聚合管道是装配线,聚合阶段是装配站,操作符表达式则是专用工具。

使用查询操作(例如 find() 方法),您可以执行以下操作:

  • 选择要返回的文档

  • 选择要返回哪些字段

  • 对结果进行排序

通过使用聚合操作,可执行以下操作:

  • 执行所有查询操作

  • 重命名字段

  • 计算字段

  • 汇总数据

  • 对值进行分组

聚合操作有一些限制:

  • 返回的文档不得违反 16 兆字节的 BSON 文档大小限制

  • 默认情况下,管道阶段的内存限制为100 MB。 如有必要,您可以通过将AggregateOptionsallowDiskUse属性设置为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 博客文章中找到另一聚合管道示例。

后退

Promises