SQL ORDER BYをMongoDBのsort()または$sortステージに変換する

SQL ORDER BYのASCおよびDESC方向がMongoDBのsort()カーソルメソッドまたは$sort集計ステージに結果の並べ替えのためにマッピングされる方法を学びます。

Migration

詳細な説明

ORDER BYからsort() / $sortへ

SQLのORDER BYは1つ以上のカラムで結果をソートします。MongoDBでは、find()クエリの.sort()カーソルメソッド、またはパイプラインの$sort集計ステージにマッピングされます。

SQLの例

SELECT * FROM products
ORDER BY price DESC, name ASC

生成されるMongoDBクエリ(find)

db.products.find({}).sort({
  price: -1,
  name: 1
})

生成されるMongoDBクエリ(aggregate)

db.products.aggregate([
  {
    $sort: {
      price: -1,
      name: 1
    }
  }
])

方向のマッピング

SQL MongoDB 説明
ASC 1 昇順(最小から最大)
DESC -1 降順(最大から最小)
(デフォルト) 1 SQLはデフォルトでASC;MongoDBは明示的な方向指定が必要

複数フィールドソート

MongoDBはソート指定のフィールドの順序を尊重します。上記の例では、ドキュメントはまずpriceの降順でソートされ、次に同じ価格のドキュメントはnameの昇順でソートされます。これはSQLの動作と完全に一致します。

ソートとインデックスの使用

最適なパフォーマンスのために、ソートフィールドとその方向は既存のインデックスに一致する必要があります。MongoDBはインメモリソート(100 MBのメモリ制限があり、allowDiskUseで構成可能)を回避するためにインデックスを使用できます。

{ price: -1, name: 1 }のインデックスは上記のクエリを効率的にします。方向が逆の{ price: 1, name: -1 }のインデックスも、MongoDBがインデックスをどちらの方向にもトラバースできるため使用可能です。

集計パイプラインでのソート

集計パイプラインで$sortを使用する場合、正しい結果を得るために$match$groupステージの後、$limit$skipの前に配置してください。$sort$limitの直前にある場合、MongoDBはこれを上位N件の結果のみを追跡する単一の操作に最適化します。

ユースケース

ソート可能なカラムを持つ商品一覧ページ、リーダーボード、ユーザー制御のソートパラメータをサポートするAPIエンドポイントにはORDER BYの変換が必要です。ソート方向のマッピングとインデックスへの影響を理解することで、移行後のクエリのパフォーマンスが保証されます。

試してみる — SQL to MongoDB Query

フルツールを開く