定義
cursor.sort(sort)クエリが一致するドキュメントを返す順序を指定します。データベースからドキュメントを取得する前に、カーソルに
sort()を適用する必要があります。
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
- MongoDB Atlas はクラウドでのMongoDB配置のためのフルマネージド サービスです
注意
このコマンドは、すべてのMongoDB Atlasクラスターでサポートされています。すべてのコマンドの Atlas サポートの詳細については、「 サポートされていないコマンド 」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
sort()メソッドには次のパラメーターがあります。
Parameter | タイプ | 説明 |
|---|---|---|
| ドキュメント | 結果セットのソート順を定義するドキュメント。 |
sort パラメーターには、フィールドと値のペアが次の形式で含まれます。
{ field: value }
ソートドキュメントでは、既存のフィールドで昇順または降順のソートを指定することも、 テキスト スコアメタデータでソートすることもできます。
動作
制限
最大 32 個のキーでソートすることができます。
重複するフィールドを含むソート パターンを指定すると、エラーが発生します。
ソートの一貫性
MongoDB では、コレクション内のドキュメントを特定の順序で保存することはありません。重複する値を含むフィールドでソートする場合、それらの値を含むドキュメントは任意の順序で返されます。
$sort 操作は「安定ソート」ではありません。これはソートキーと同等のドキュメントが、入力時と同じ相対的順序で出力に残ることは保証されないという意味です。
ソート条件で指定されたフィールドが2つのドキュメントに存在しない場合、それらがソートされる値は同じです。2つのドキュメントは、任意の順序で返される可能性があります。
一貫したソート順序が必要な場合は、一意の値を含むフィールドを少なくとも 1 つ含めてソートしてください。これを保証する最も簡単な方法は、_idフィールドをソートのクエリに含めることです。
次の例では、sample_restaurantsデータベースの restaurantsコレクションを使用します。このコレクションには重複値を持つ boroughフィールドを持つドキュメントが含まれています。
次のコマンドは、sort() メソッドを使用してborough フィールドでソートします。
db.getSiblingDB("sample_restaurants").restaurants.find( { borough: { $in: [ "Brooklyn", "Manhattan" ] } }, { name: 1, borough: 1 } ).sort( { borough: 1 } ).limit( 5 )
この例では 、boroughフィールドに重複する値が含まれているため、ソート順序に一貫性がない可能性があります。ドキュメントは borough のアルファベット順に返されますが、borough の 値が重複しているドキュメントでは、同じソートを複数回実行すると順序が異なる場合があります。
一貫性のあるソートを実現するには、一意の値のみを含むフィールドをソートに追加します。次のコマンドは、sort() メソッドを使用して、borough フィールドと_id フィールド の両方でソートします。
db.getSiblingDB("sample_restaurants").restaurants.find( { borough: { $in: [ "Brooklyn", "Manhattan" ] } }, { name: 1, borough: 1 } ).sort( { borough: 1, _id: 1 } ).limit( 5 )
[ { _id: ObjectId('5eb3d668b31de5d588f4292a'), borough: 'Brooklyn', name: 'Riviera Caterer' }, { _id: ObjectId('5eb3d668b31de5d588f4292b'), borough: 'Brooklyn', name: "Wilken'S Fine Food" }, { _id: ObjectId('5eb3d668b31de5d588f4292d'), borough: 'Brooklyn', name: "Wendy'S" }, { _id: ObjectId('5eb3d668b31de5d588f42931'), borough: 'Brooklyn', name: 'Regina Caterers' }, { _id: ObjectId('5eb3d668b31de5d588f42932'), borough: 'Brooklyn', name: 'Taste The Tropics Ice Cream' } ]
_id フィールドには常に一意の値のみが含まれることが保証されているため、同じソートを複数回実行しても返されるソート順序は常に同じになります。
重要
存在しないフィールドでソートする場合、 MongoDB は特定の出力順序を保証しません。このような場合の動作は、バージョンによって異なる場合があります。
昇順および降順ソート
昇順または降順のソートを指定するには、ソート パラメーターで、ソートするフィールドを 1 つまたは複数指定し、1 または -1 の値を指定します。
次の操作では、sample_mflixデータベース内の moviesコレクションのドキュメントを、最初に yearフィールドで降順にソートし、次に titleフィールドで昇順にソートします。
db.movies.find( { year: { $type: "int" } }, { _id: 0, title: 1, year: 1 } ).sort( { year: -1, title: 1 } ).limit( 5 )
[ { title: 'The Masked Saint', year: 2016 }, { title: '(T)ERROR', year: 2015 }, { title: '11 Minutes', year: 2015 }, { title: '13 Minutes', year: 2015 }, { title: '3 1/2 Minutes, Ten Bullets', year: 2015 } ]
ソート操作で異なる BSON types の値を比較する場合、MongoDB は最小値から最大値の順に次の比較順序を使用します。
MinKey(内部型)
null
数値(ints、longs、doubles、decimals)
シンボル、文字列
オブジェクト
配列
BinData
ObjectId
ブール値
日付
タイムスタンプ
正規表現
JavaScriptコード
JavaScript コード(スコープ付き)
MaxKey(内部型)
特定のタイプの比較およびソート順序の詳細については、「比較およびソート順序」を参照してください。
Text Score Metadata Sort
注意
$text は、自己管理型(Atlas 以外)配置に対するテキスト クエリ機能を提供します。 MongoDBでホストされているデータに対して、 MongoDB は改良された全文クエリ ソリューションであるMongoDB Search も提供します。
$textを使用する場合は、 { $meta: "textScore" }式を使用して関連性スコアを降順に並べ替えることができます。
次のサンプル ドキュメントでは、 "textScore" メタデータによる降順のソートを指定しています。
db.users.find( { $text: { $search: "operating" } }, { score: { $meta: "textScore" }} ).sort({ score: { $meta: "textScore" } })
"textScore" メタデータは降順でソートされます。
詳細については、$meta を参照してください。
配列フィールドによるソート
MongoDB が配列値フィールドでドキュメントをソートする場合、ソートキーは昇順か降順かのどちらかによって異なります。
昇順ソートでは、ソートキーは配列内の最小値になります。
降順ソートでは、ソートキーは配列内の最も高い値になります。
クエリフィルターは、ソート キーの選択に影響しません。
例、次のクエリは、sample_mflixデータベースの moviesコレクションを使用して、ドキュメントを genres 配列フィールドで昇順と降順でソートします。
db.movies.find( { genres: { $exists: true, $ne: [] } }, { _id: 0, title: 1, genres: 1 } ).sort( { genres: 1 } ).limit( 3 )
db.movies.find( { genres: { $exists: true, $ne: [] } }, { _id: 0, title: 1, genres: 1 } ).sort( { genres: -1 } ).limit( 3 )
昇順ソートでは、 MongoDB はソートのキーとして最初のジャンルをアルファベット順に使用します。降順ソートでは、 MongoDB は最後のジャンルをソートのキーとしてアルファベット順に使用します。
配列フィールドでフィルタリングおよびソートを行う
配列を含むフィールドでフィルターを適用してソートする場合、フィルターはソートキーとして使用される値に影響を与えません。ソートは常に、配列内のすべての値を潜在的なソートキーとして考慮します。
例、次のクエリは、ジャンルが "P" より大きい映画を検索し、結果を昇順に並べ替えます。
db.movies.find( { genres: { $gt: "P" } }, { _id: 0, title: 1, genres: 1 } ).sort( { genres: 1 } ).limit( 3 )
並べ替えは昇順です。つまり、その値がフィルター { genres: { $gt: "P" } } と一致しない場合でも、ソートキーは genres 配列内の最小値であることを意味します。
Tip
一致した値のみでソート
一致した値のみを潜在的なソートキーとして考慮するには、一致した値を含む新しいフィールドを生成し、そのフィールドでソートします。詳細については、これらのパイプラインステージと式を参照してください。
ソートとインデックスの使用
コレクションにソートフィールドを含むインデックスがある場合、MongoDB はそのインデックスを使用してソート操作の結果を取得できます。$or クエリでは、$or 式の各節で独自のインデックスを使用できるため、MongoDB は複数のインデックスを使用して単一のソート操作をサポートすることがあります。
MongoDB は、 インデックスまたは複数のインデックスを使用してソート順序を取得できない場合、データに対してMongoDB内ソート操作を実行する必要があります。
インデックスを使用するソート操作は、多くの場合、メモリ内ソートよりもパフォーマンスが優れています。ソート操作をサポートするインデックスの作成の詳細については、クエリ結果をソートするためにインデックスを使用する を参照してください。
MongoDB がメモリ内ソートを実行する必要があるかどうかを確認するには、クエリに cursor.explain() を追加し、 explain の結果 を確認します。クエリプランに SORT ステージが含まれている場合、 MongoDB はメモリ内ソート操作 を実行する必要があります。
メモリ内ソートがメモリを消費しすぎるのを防ぐ方法は次のとおりです。
ソート操作をサポートするインデックスを作成します。詳細と例については、「インデックスを使用してクエリ結果をソートする」を参照してください。
ソートするデータの量を制限するには、
cursor.limit()とcursor.sort()を組み合わせて使用します。詳細と例については、「 結果の制限 」を参照してください。
結果を制限する
を sort()limit()と組み合わせて使用すると、(ソート順序で)最初の ドキュメントを返すことができます。ここでは、kk は指定された制限です。
MongoDB では、ソート順序をインデックススキャンで取得できない場合、Top-k ソートアルゴリズムを使用します。このアルゴリズムでは、基礎のインデックスやコレクションへのアクセスによってそれまでに確認された結果のうち、最初の(ソート順序によっては最後の) k 件をバッファします。これら k 件の結果のメモリ使用量が 100 メガバイトを超える場合、クエリで値 false の cursor.allowDiskUse() が指定されていない限り、MongoDB は一時ファイルを自動的にディスクに書き込み (write)ます(その場合、クエリは失敗します)。
プロジェクションとの相互作用
操作によってソートとプロジェクトの両方が同じフィールドでソートされる場合、 MongoDB はプロジェクションを適用する前に、元のフィールド値でソートします。
例
次の例えでは、sample_mflix データベースの movies コレクションを使用します。
次のクエリは、ソート順を指定せずに映画を返します。
db.movies.find( {}, { _id: 0, title: 1, runtime: 1 } ).limit( 3 )
このクエリでは、返すドキュメントの順序は一定ではありません。
次のクエリは、runtimeフィールドで降順の並べ替えを指定します。
db.movies.find( {}, { _id: 0, title: 1, runtime: 1 } ).sort( { runtime: -1 } ).limit( 5 )
[ { title: 'Centennial', runtime: 1256 }, { title: 'Baseball', runtime: 1140 }, { title: 'Taken', runtime: 877 }, { title: 'Space', runtime: 780 }, { title: 'Reilly: Ace of Spies', runtime: 720 } ]
次のクエリは、最初に imdb.ratingフィールドを昇順でソートし、次に titleフィールドで昇順にソートします。
db.movies.find( { "imdb.rating": { $type: "double" } }, { _id: 0, title: 1, "imdb.rating": 1 } ).sort( { "imdb.rating": 1, title: 1 } ).limit( 5 )
[ { title: "Justin Bieber's Believe", imdb: { rating: 1.6 } }, { title: 'Justin Bieber: Never Say Never', imdb: { rating: 1.6 } }, { title: 'Saving Christmas', imdb: { rating: 1.6 } }, { title: 'Disaster Movie', imdb: { rating: 1.9 } }, { title: 'Superbabies: Baby Geniuses 2', imdb: { rating: 1.9 } } ]
自然な順序で返す
$natural パラメーターを使うと、データベース内の自然な順序に従って項目を返します。この順序付けは内部実装機能であり、ドキュメントが特定の順序になることを前提にしないでください。
注意
MongoDB 7.0 より前では、$natural は 0、NaN、"X"、-0.01 などの誤った型値を受け入れます。MongoDB 7.0 以降で、1 と -1 以外の値を $natural に渡すと、 MongoDB はエラーを返します。
インデックスの使用
$natural によるソートを含むクエリでは、次の例外を除き、クエリ述語を実行するためにインデックスは使用されません。クエリ述語が_id フィールド { _id: <value> } の等価条件である場合のみ、$natural によるソートを含むクエリで _id インデックスを使用できます。
Tip