SQL AVG、MIN、MAXをMongoDB集計アキュムレータに変換する

SQL集計関数AVG()、MIN()、MAX()が$groupパイプラインステージのMongoDB $avg、$min、$maxアキュムレータに変換される方法を学びます。

Aggregation

詳細な説明

AVG、MIN、MAX集計関数

SQLのAVGMINMAX集計関数にはそれぞれ、$groupステージのアキュムレータ演算子に直接対応するMongoDBの同等物があります。

SQLの例

SELECT department,
       AVG(salary) AS avg_salary,
       MIN(salary) AS min_salary,
       MAX(salary) AS max_salary
FROM employees
GROUP BY department

生成されるMongoDBクエリ

db.employees.aggregate([
  {
    $group: {
      _id: "$department",
      avg_salary: { $avg: "$salary" },
      min_salary: { $min: "$salary" },
      max_salary: { $max: "$salary" },
      department: { $first: "$department" }
    }
  }
])

アキュムレータマッピング

SQL関数 MongoDB演算子 説明
AVG(col) { $avg: "$col" } 値の算術平均
MIN(col) { $min: "$col" } 最小値
MAX(col) { $max: "$col" } 最大値
SUM(col) { $sum: "$col" } 値の合計
COUNT(*) { $sum: 1 } ドキュメント数

GROUP BYなしの場合

SQLではGROUP BYなしで集計関数を使用でき、テーブル全体を集計します:

SELECT AVG(price) AS avg_price FROM products

MongoDBでは、すべてのドキュメントを集計するためにnull_idとして使用します:

db.products.aggregate([
  { $group: { _id: null, avg_price: { $avg: "$price" } } }
])

非数値フィールドでの$minと$max

SQLではMINMAXは通常数値や日付に使用されますが、MongoDBの$min$maxはBSON比較順序に従い、型をまたいで機能します。文字列は辞書順で、日付は時系列で比較され、異なる型はMongoDBの比較階層に従います。

$matchとの組み合わせ

集計前にドキュメントをフィルタリングするために、$groupの前に$matchステージを追加します。これはGROUP BYの前のSQL WHEREと同等です:

db.employees.aggregate([
  { $match: { status: "active" } },
  { $group: { _id: "$department", avg_salary: { $avg: "$salary" } } }
])

ユースケース

部門別の給与統計を表示するHRダッシュボード、カテゴリ別の平均評価を示す商品分析、最小/最大応答時間による運用監視はすべてこれらの集計関数に依存します。あらゆる分析移行の重要な構成要素です。

試してみる — SQL to MongoDB Query

フルツールを開く