SQL GROUP BYとSUMをMongoDBの$groupと$sumフィールドに変換する

SQL GROUP BYとSUM(column)が特定フィールドの$sumアキュムレータを使用したMongoDB集計パイプラインに変換される方法を学びます。

Aggregation

詳細な説明

GROUP BY SUMから$group $sumへ

COUNTがドキュメントごとに1を加算するのに対し、SUMは実際のフィールド値を加算します。MongoDBの$sumアキュムレータは両方のケースを処理します — 違いは1を渡すかフィールド参照を渡すかです。

SQLの例

SELECT category, SUM(amount) AS total_amount
FROM transactions
GROUP BY category

生成されるMongoDBクエリ

db.transactions.aggregate([
  {
    $group: {
      _id: "$category",
      total_amount: { $sum: "$amount" },
      category: { $first: "$category" }
    }
  }
])

フィールド参照を使った$sum

COUNTとの主な違いは$sumの引数です:

  • { $sum: 1 } — ドキュメントをカウント(COUNT(*)と同等)
  • { $sum: "$amount" }amountフィールドの値を合計(SUM(amount)と同等)

$プレフィックスは、リテラル文字列ではなくフィールドの値を参照するようMongoDBに指示します。

複数の集計

SQLでは単一クエリで複数の集計関数を使用できます:

SELECT category, SUM(amount) AS total, COUNT(*) AS count
FROM transactions
GROUP BY category
db.transactions.aggregate([
  {
    $group: {
      _id: "$category",
      total: { $sum: "$amount" },
      count: { $sum: 1 },
      category: { $first: "$category" }
    }
  }
])

NULL値の処理

SQLではSUMはNULL値を無視します。MongoDBの$sumもフィールドが欠落またはnullのドキュメントを無視し、同じ動作を生成します。ただし、フィールドに非数値の値が含まれている場合、MongoDBはSQLのようにエラーを発生させるのではなく、それらをスキップします。

小数点精度

金融計算の場合、MongoDBはデフォルトでIEEE 754浮動小数点を使用することに注意してください。正確な小数演算にはSQLのDECIMAL / NUMERIC型に類似したDecimal128型を使用してください。

ユースケース

商品カテゴリ、地域、期間別の総売上を計算する収益レポーティングクエリは、あらゆるビジネスインテリジェンスシステムの核心です。SUM集計の変換は、SQLからMongoDBに移行する財務ダッシュボードにとって重要です。

試してみる — SQL to MongoDB Query

フルツールを開く