SELECT DISTINCTをMongoDB distinct()またはAggregateに変換する

SQL SELECT DISTINCTが$groupステージを使用したMongoDB集計パイプラインにマッピングされ、コレクションからユニークな値を取得する方法を学びます。

Basic Queries

詳細な説明

DISTINCTから$groupへ

SQLのSELECT DISTINCTは結果セットから重複行を排除します。MongoDBでは、選択されたフィールドでグループ化する$groupステージを使用した集計パイプラインで実現されます。

SQLの例

SELECT DISTINCT status FROM orders

生成されるMongoDBクエリ

db.orders.aggregate([
  {
    $group: {
      _id: "$status",
      status: { $first: "$status" }
    }
  }
])

代替手段:db.collection.distinct()

単一フィールドのdistinctクエリの場合、MongoDBにはよりシンプルなメソッドもあります:

db.orders.distinct("status")

これはドキュメントではなくユニークな値のプレーン配列を返します。ただし、distinct()は単一フィールドに限定され、16 MBの結果サイズ制限があるため、aggregateアプローチの方がより汎用的です。

複数フィールドのDISTINCT

DISTINCTが複数のカラムに適用される場合、$groupステージは複合_idを使用します:

SELECT DISTINCT category, status FROM products
db.products.aggregate([
  {
    $group: {
      _id: { category: "$category", status: "$status" },
      category: { $first: "$category" },
      status: { $first: "$status" }
    }
  }
])

使い分け

単一フィールドの一意性チェックにはdistinct()を使用します。複数フィールドのユニークな組み合わせが必要な場合、または重複排除後に$sort$matchなどの追加ステージを連鎖させたい場合は、集計パイプラインを使用します。

ユースケース

ECサイトでは、カテゴリ、ブランド、ステータス値のユニーク値でフィルタードロップダウンを作成する必要があることが多いです。SQL DISTINCTクエリの変換は、MongoDBが動的UI生成のためにこれらのユニーク値を効率的に取得する方法を示します。

試してみる — SQL to MongoDB Query

フルツールを開く