聚合管道入门

聚合管道是一个功能强大的工具,支持开发人员对其集合执行高级数据分析和操作。 管道是一系列数据处理操作,这些操作在输入文档中执行以生成计算输出。 管道阶段处理输入文档并将结果传递到下一阶段。 每个阶段对数据执行特定的操作,例如筛选、分组、排序和转换。

基本语法

聚合管道的基本语法如下:

db.collection.aggregate([    { stage1 },    { stage2 },    ...    { stageN }])

其中,db.collection 是要对其执行聚合的 MongoDB 集合,stage1、stage2、...、stageN 是要应用的管道阶段。

示例阶段

Cosmos DB for MongoDB 提供了可在管道中使用的各种阶段,包括:

  • $match:筛选文档,仅传递符合指定条件的文档。
  • $project:通过添加、删除或更新字段将文档转换为新形式。
  • $group:按一个或多个字段对文档进行分组,并对分组数据执行各种聚合函数。
  • $sort:根据指定字段对文档进行排序。
  • $skip:跳过指定数量的文档。
  • $limit:限制传递给下一阶段的文档数。
  • $unwind:从输入文档中解构一个数组字段,为每个元素输出一个文档。

若要查看所有可用阶段,请参阅支持的功能

示例

以下是有关如何使用聚合管道对数据执行各种操作的一些示例:

筛选:若要筛选“quantity”字段大于 20 的文档,可以使用以下管道:

db.collection.aggregate([
    { $match: { quantity: { $gt: 20 } } }
])

分组:若要按“category”字段对文档进行分组并计算每个组的总“quantity”,可以使用以下管道:

db.collection.aggregate([
    { $group: { _id: "$category", totalQuantity: { $sum: "$quantity" } } }
])

排序:若要按“price”字段降序排列文档,可以使用以下管道:

db.collection.aggregate([
    { $sort: { price: -1 } }
])

转换:若要向“price”大于 100 的文档添加新字段“discount”,可以使用以下管道:

db.collection.aggregate([
    { $project: { item: 1, price: 1, discount: { $cond: [{ $gt: ["$price", 100] }, 10, 0 ] } } }
])

展开:若要将所有子文档与数组字段“tags”分开并为每个值创建一个新文档,可以使用以下管道:

db.collection.aggregate([
    { $unwind: "$tags" }
])

具有多个阶段的示例

db.sales.aggregate([
  { $match: { date: { $gte: "2021-01-01", $lt: "2021-03-01" } } },
  { $group: { _id: "$category", totalSales: { $sum: "$sales" } } },
  { $sort: { totalSales: -1 } },
  { $limit: 5 }
])

在此示例中,我们使用一个名为“sales”的示例集合,其中包含具有以下字段的文档:“date”、“category”和“sales”。

第一阶段 { $match: { date: { $gte: "2021-01-01", $lt: "2021-03-01" } } } 按“date”字段筛选文档,仅传递日期在 2021 年 1 月 1 日至 2021 年 2 月 28 日之间的文档。 我们使用的是“YYYY-MM-DD”格式的字符串日期格式。

第二阶段 { $group: { _id: "$category", totalSales: { $sum: "$sales" } } } 按“category”字段对文档进行分组,并计算每个组的总销售额。

第三阶段 { $sort: { totalSales: -1 } } 根据“totalSales”字段对文档进行降序排序。

第四阶段 { $limit: 5 } 将传递给下一阶段的文档数限制为仅前 5 个。

因此,管道将返回指定日期范围内总销售额排名前 5 的类别。

后续步骤