開始使用彙總管線

彙總管線是功能強大的工具,可讓開發人員在其集合上執行進階資料分析和操作。 管線是一連串的資料處理作業,會對輸入文件執行以產生計算輸出。 管線階段會處理輸入文件,並將結果傳遞至下一個階段。 每個階段都會對資料執行特定作業,例如篩選、分組、排序和轉換。

基本語法

彙總管線的基本語法如下:

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 } }
])

轉換:若要將新欄位 "discount" 新增至 "price" 大於 100 的文件,您可以使用下列管線:

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" } } } 會篩選文件,只傳遞日期介於 2021 年 1 月 1 日到 2021 年 2 月 28 日之間的文件。 我們使用格式為「YYYY-MM-DD」的字串日期格式。

第二個階段 { $group: { _id: "$category", totalSales: { $sum: "$sales" } } } 依 "category" 欄位來分組文件,並計算每個群組的總銷售額。

第三個階段 { $sort: { totalSales: -1 } } 會依遞減順序的 "totalSales" 欄位來排序文件。

第四個階段 { $limit: 5 } 會將傳遞至下一個階段的文件數目限制為只有前 5 個。

因此,管線會依指定日期範圍的總銷售額傳回前 5 個類別。

下一步