ソート順が指定されていない場合、MongoDB はレコードをどのようにソートしますか? 質問する

ソート順が指定されていない場合、MongoDB はレコードをどのようにソートしますか? 質問する

ソート順を指定せずに Mongo find() クエリを実行すると、データベースは内部的に何を使用して結果をソートするのでしょうか?

によるmongo ウェブサイトのドキュメント:

パラメータなしで find() を実行すると、データベースはオブジェクトを順方向の自然な順序で返します。

標準テーブルの場合、自然順序は挿入順序に近いことが多いものの、必ずしもそうであるとは限らないため、特に有用ではありません。ただし、キャップ コレクションの場合、自然順序は挿入順序であることが保証されます。これは非常に有用です。

しかし、標準コレクション(上限なしコレクション)の場合、結果を並べ替えるために使用されるフィールドは何ですか?_idフィールドか何か他のものですか?

編集:

基本的に、私が言いたいのは、次の検索クエリを実行した場合、

db.collection.find({"x":y}).skip(10000).limit(1000);

2 つの異なる時点:t1そしてt2、異なる結果セットが得られますか:

  1. t1 と t2 の間に追加の書き込みがなかった場合はどうなりますか?
  2. t1 と t2 の間に新しい書き込みがあったのはいつですか?
  3. t1 と t2 の間に追加された新しいインデックスはありますか?

一時データベースでいくつかのテストを実行しましたが、得られた結果は同じでした(はい) を実行しましたが、念のため確認したかったので、テスト ケースがあまり徹底的ではなかったことは確かです。

ベストアンサー1

何も指定されていない場合のデフォルトの並べ替え順序は何ですか?

デフォルトの内部ソート順(または自然の秩序)は未定義sort()実装の詳細。順序の維持はストレージエンジンにとって余分なオーバーヘッドであり、MongoDBのAPIは明示的な場合や特別な場合を除いて予測可能性を義務付けていません。クラスター化されたコレクション固定サイズ上限コレクション

一般的なワークロードでは、ストレージエンジンが利用可能な事前割り当て領域を再利用し、ディスクとメモリにデータを最も効率的に保存する方法を決定することが望ましい。クエリ基準がない場合、結果はストレージエンジンによって次のように返されます。自然の秩序(別名見つかった順に) 結果の順序は挿入順序と一致する可能性がありますが、この動作は保証されておらず、依存することはできません (クラスター化されたコレクションまたは上限が設定されたコレクションを除く)。

ストレージの(自然な)順序に影響を与える可能性のある例をいくつか示します。

  • WiredTiger は、ディスク上のドキュメントとメモリ内キャッシュ上のドキュメントの異なる表現を使用するため、内部データ構造に基づいて自然な順序が変わる場合があります。

  • オリジナルの MMAPv1 ストレージ エンジン (MongoDB 4.2 で削除) は、パディング ルールに基づいてドキュメントのレコード領域を割り当てます。ドキュメントが現在割り当てられているレコード領域を超えると、ドキュメントの場所 (および自然な順序) が影響を受けます。ドキュメントが削除または移動されたために再利用可能とマークされたストレージに、新しいドキュメントを挿入することもできます。

  • レプリケーションでは、べき等な oplogレプリカ セット メンバー全体で書き込み操作を一貫して適用するための形式です。各レプリカ セット メンバーは、自然な順序が異なる可能性があるローカル データ ファイルを保持しますが、oplog 更新が適用されると、同じデータ結果になります。

インデックスを使用するとどうなるでしょうか?

インデックスが使用されている場合、ドキュメントは見つかった順序で返されます (挿入順序または I/O 順序と一致する必要は必ずしもありません)。複数のインデックスが使用されている場合、順序は重複排除プロセス中にどのインデックスが最初にドキュメントを識別したかによって内部的に決まります。

予測可能な並び順が必要な場合はしなければならないクエリに明示的に含めsort()、ソート キーに一意の値を設定します。

キャップされたコレクションは挿入順序をどのように維持しますか?

キャップされたコレクションの自然順序に関する実装例外は、特別な使用制限: ドキュメントは挿入順に保存されますが、既存のドキュメントのサイズを増やすことはできず、ドキュメントを明示的に削除することもできません。順序付けは、最も古いドキュメントが最初に「期限切れ」になることを保証する、上限付きコレクション設計の一部です。

クラスター化されたコレクション (MongoDB 5.3+)

_idMongoDB 5.3以降では、ドキュメントをインデックスキーの値で順序付けたクラスター化されたコレクションを作成できるようになりました。clusteredIndexコレクションを作成するときに宣言する必要があります。クラスター化されたコレクションには、使用制限ただし、範囲スキャンやクラスター化インデックス キーの等価比較などのクエリのパフォーマンスは向上します。

おすすめ記事