[MongoDB] 聚合操作概念 – 使用 aggregate() 範例

MongoDB 提供合管線(Aggregate pipeline)的框架,以管線的概念來處理大量數據的內容,轉換為有用的聚合結果(Aggregated results)。Aggregate pipeline 比起 mapReduce 的資料處理方式更容易想像,因為在 aggregate 框架中輸入的資料會被轉換為多個階段的管線資料,然而最後一個階段的管線資料則為聚合的結果。

聚合管線的框架,共分為四個聚合管線:

  • $match 篩選
  • $group 分組
  • $project 映射
  • $out 輸出

aggregate() 的語法

db.collection.aggregate(
  [<pipeline 1>, <pipeline 2>, ...],
  [<options>]
)

可使用的 <pipeline>,包含 $match$group$project$limit$skip$geoNear$lookup 等。

aggregate 執行步驟

管線1:篩選 $match

先對集合內的資料進行篩選或排序的處理:

db.getCollection('customers').aggregate([
  {$match: {city: "台北市"}}
])

管線2:分組 $group

針對篩選後的資料進行分組。假設用 _id 欄位作為分組規則,判斷資料的 district 欄位值是否要被分在同一組,分在同組的資料的 age 值利用 $push 儲存到 ages 陣列的最後一個,完成管線2的資料處理。

db.getCollection('customers').aggregate([
  {$match: {city: "台北市"}},
  {$group: {_id: "$district", ages: {$push: "$age"}}}
])

管線3:映射 $project

針對欄位進行計算後,重新輸出(映射)到某個欄位。在此我們將 ages 的陣列進行 $sum 加總,並保留 _id 欄位,完成管線3的資料處理。

db.getCollection('customers').aggregate([
  {$match: {city: "台北市"}},
  {$group: {_id: "$district", ages: {$push: "$age"}}},
  {$project: {_id: 1, values:{$sum: "$ages"}}}
])

管線4:輸出位置 $out

將最後的資料儲存在集合。在此,將資料儲存到 taipei_city 集合,即完成所有管線的資料處理。

db.getCollection('customers').aggregate([
  {$match: {city: "台北市"}},
  {$group: {_id: "$district", ages: {$push: "$age"}}},
  {$project: {_id: 1, values:{$sum: "$ages"}}},
  {$out: "taipei_city"}
])

您可在此處留言

avatar

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料

  Subscribe  
Notify of