使用 MongoDB 按多個欄位對值進行分組

Tahseen Tauseef 2023年1月30日 2022年5月13日
  1. MongoDB 中的 $group 運算子
  2. $group 關於 MongoDB 中的多個鍵
  3. 在 MongoDB 中 $group 使用 $match 的多個鍵
  4. MongoDB 中的 $group 區別值
  5. 在 MongoDB 中 $group 階段對發票日期進行分組
使用 MongoDB 按多個欄位對值進行分組

MongoDB 按多個欄位分組用於使用各種方法按多個欄位對值進行分組。

對 MongoDB 文件中存在的各種欄位進行分組的最有效方法之一是使用 $group 運算子,它有助於在分組資料上執行多個其他聚合函式。

本文將討論在 MongoDB 中使用運算子按文件內的多個欄位對值進行分組的多種方法。它還將檢視與聚合一起使用的運算子列表,以及如何藉助示例來實現它們。

MongoDB 中的 $group 運算子

MongoDB 的 $group 運算子對幾個聚合欄位的輸入和輸出只不過是資料庫的書面記錄。它接受單個文件並返回一個或多個文件。

在對各個欄位進行分組時,你可以使用各種運算子,如下所述。

  1. $first – 僅從一組文件中提取第一個文件,通常在排序時使用。
  2. $push – 在結果欄位中插入一個欄位的新值。
  3. $last – 最後在結果欄位中插入一個欄位的新值。
  4. $addToSet - 有助於在不發生任何重複的情況下向陣列的現有值新增新值。
  5. $min - 此運算子幫助從提供和傳遞的整數值中查詢並返回最小整數或最小值。
  6. $avg – 計算欄位之間所有指定數值的平均值。
  7. $max - 幫助從提供和傳遞的整數值中查詢並返回最重要的整數值或最大值。
  8. $sum - 它將計算所有指定數值的總和。

聚合管道

POSIX 模式設定為 true 時,在 MongoDB 中對欄位進行分組的另一種方法是使用管道。使用聚合物管功能,你可以過濾出符合聚合管道標準的文件。

為聚合管道的每個級別定義階段運算子。階段運算子可以在內部使用表示式運算子在每個級別階段之前進行換行,甚至可以計算平均值或求和或連線特定值。

聚合管道的輸出被視為最終要返回的輸出,如果需要,它甚至可以儲存在集合中。

處理流程

對多個欄位進行分組的另一種方法是使用處理流。你可以使用 Db.collection.aggregate() 函式使用各種通道同時處理資料。

Db.collection.aggregate() 函式在內部進行聚合併為要使用的多個操作提供支援。

Db.collection.aggregate() 函式可以有效地用於一系列切片,而不會導致資料丟失。函式 Db.collection.aggregate() 返回儲存在記憶體中的資料作為遊標,可以直接用作 MongoShell

MongoDB 中的 $group 運算子示例

你可以在本文中使用以下集合。

db={
  "invoice": [
    {
      "_id": 1,
      "item": "apple",
      "qty": 20,
      "rate": 10,
      "inv_date": "02/02/2020"
    },
    {
      "_id": 2,
      "item": "orange",
      "qty": 15,
      "rate": 8,
      "inv_date": "05/12/2020"
    },
    {
      "_id": 3,
      "item": "mango",
      "qty": 25,
      "rate": 8,
      "inv_date": "07/02/2020"
    },
    {
      "_id": 4,
      "item": "apple",
      "qty": 20,
      "rate": 10,
      "inv_date": "02/02/2020"
    },
    {
      "_id": 5,
      "item": "mango",
      "qty": 10,
      "rate": 8,
      "inv_date": "05/12/2020"
    },
    {
      "_id": 6,
      "item": "apple",
      "qty": 30,
      "rate": 10,
      "inv_date": "13/04/2020"
    },
    {
      "_id": 7,
      "item": "orange",
      "qty": 15,
      "rate": 8,
      "inv_date": "05/12/2020"
    },
    {
      "_id": null,
      "item": "banana",
      "qty": 10,
      "rate": 20,
      "inv_date": "17/12/2020"
    },

  ]
}

以下示例按發票日期欄位分組,並顯示同一日期的總成本、平均數量和發票數量。

db.invoice.aggregate([
  {
    $group: {
      _id: "$inv_date",
      totalCost: {
        $sum: {
          $multiply: [
            "$rate",
            "$qty"
          ]
        }
      },
      avgQty: {
        $avg: "$qty"
      },
      count: {
        $sum: 1
      }
    }
  }
])

結果顯示欄位發票日期的文件已分組,並顯示該日期的總成本、平均數量以及開出的發票數量。

分組值

$group 關於 MongoDB 中的多個鍵

以下示例按發票日期分組,然後按專案欄位分組,並顯示同一日期的總成本、平均數量和發票數量。

db.invoice.aggregate([
  {
    $group: {
      _id: {
        inv_date: "$inv_date",
        item: "$item"
      },
      totalCost: {
        $sum: {
          $multiply: [
            "$rate",
            "$qty"
          ]
        }
      },
      avgQty: {
        $avg: "$qty"
      },
      count: {
        $sum: 1
      }
    }
  }
])

下面的結果顯示發票日期 05/12/202002/02/2020 的文件具有相同的專案;這兩個領域的組合形成了一個群體。

組值 1

在 MongoDB 中 $group 使用 $match 的多個鍵

以下示例按發票日期分組,然後按專案欄位分組,並顯示發票日期為 05/12/2020 的那些單據在同一日期的總成本、平均數量和發票編號。

db.invoice.aggregate([
  {
    $match: {
      inv_date: "05/12/2020"
    }
  },
  {
    $group: {
      _id: {
        inv_date: "$inv_date",
        item: "$item"
      },
      totalCost: {
        $sum: {
          $multiply: [
            "$rate",
            "$qty"
          ]
        }
      },
      avgQty: {
        $avg: "$qty"
      },
      count: {
        $sum: 1
      }
    }
  }
])

下面的結果顯示發票日期 05/12/2020 的單據有三張發票,但具有相同的專案組合已組成一個組。

組值 2

MongoDB 中的 $group 區別值

以下聚合操作使用 $group 階段按專案對文件進行分組,以檢索不同的專案值。

db.invoice.aggregate([
  {
    $group: {
      _id: "$item"
    }
  }
])

輸出顯示在下面的螢幕截圖中。

組值 3

在 MongoDB 中 $group 階段對發票日期進行分組

以下聚合操作使用 $group 階段按專案對文件的發票日期進行分組。

db.invoice.aggregate([
  {
    $group: {
      _id: "$item",
      invoiceDate: {
        $push: "$inv_date"
      }
    }
  }
])

下面的截圖是輸出

組值 4

本文教你使用 $group 運算子對 MongoDB 文件中存在的多個欄位進行分組的最有效方法。

它還討論了在 MongoDB 中使用運算子的所有多種形式以及與聚合一起使用的運算子列表,以及如何在示例的幫助下實現它們。