SQL ORDER BYをMongoDBのsort()または$sortステージに変換する
SQL ORDER BYのASCおよびDESC方向がMongoDBのsort()カーソルメソッドまたは$sort集計ステージに結果の並べ替えのためにマッピングされる方法を学びます。
詳細な説明
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の変換が必要です。ソート方向のマッピングとインデックスへの影響を理解することで、移行後のクエリのパフォーマンスが保証されます。