$orderby
$orderby
演算子は、クエリの結果を昇順または降順でソートします。mongosh
はcursor.sort()
メソッドを提供します。db.collection.find().sort( { age: -1 } ) 次のいずれかの形式で オプションを指定することもできます。
db.collection.find()._addSpecial( "$orderby", { age : -1 } ) db.collection.find( { $query: {}, $orderby: { age : -1 } } ) これらの例では、
age
フィールドで降順にソートされたcollection
という名前のコレクション内のすべてのドキュメントが返されます。 負の 1 の値を$orderby
に指定します(例:-1
(上記のように)降順または正の値(例:1
)を使用して昇順で並べ替えます。
動作
インデックスには順序付けられたレコードが含まれているため、MongoDB はソート フィールドを含むインデックスからソートの結果を取得できます。 MongoDB では、ソートでクエリ述語と同じインデックスを 使用する場合、ソート操作をサポートするために複数のインデックスを 使用する場合があります 。
MongoDB では、1 つまたは複数のインデックスを使用してソート順序を取得できない場合、データに対してブロッキングソート操作を実行する必要があります。ブロッキングソートは、結果を返す前に MongoDB が、ソートへのすべての入力ドキュメントを消費して処理する必要があることを示します。ブロッキングソートは、コレクションまたはデータベースに対する同時操作をブロックしません。
インデックスを使用するソート操作は、多くの場合、ブロッキングソートよりもパフォーマンスが優れています。ソート操作をサポートするインデックスの作成の詳細については、「クエリ結果をソートするためにインデックスを使用する」を参照してください。
If MongoDB requires using more than 100 megabytes of system memory for the blocking sort operation, MongoDB returns an error unless the query specifies cursor.allowDiskUse()
(New in MongoDB 4.4). allowDiskUse()
を指定することで、MongoDB は 100 メガバイトのシステムメモリ制限を超えるデータをディスク上の一時ファイルに保存し、ブロッキングソート操作を処理することができます。
このエラーを回避するには、ソート操作をサポートするインデックスを作成するか、 $orderby
をcursor.maxTimeMS()
やcursor.limit()
と組み合わせて使用します。 cursor.limit()
は、最適化されたアルゴリズムによって速度を向上させ、このクエリを返すために必要なメモリ量を減らします。 指定された制限では、 100メガバイト制限内に収まるドキュメントの数が生成される必要があります。