131

並べ替え順序を指定せずにMongofind()クエリを実行すると、データベースは結果を並べ替えるために内部的に何を使用しますか?

mongo Webサイトのドキュメントによると:

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

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

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

編集:

基本的に、私が得ようとしているのは、次の検索クエリを実行した場合です。

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

2つの異なる時点(t1t2)で、異なる結果セットが得られますか?

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

一時データベースでいくつかのテストを実行しましたが、得られた結果は3つのケースすべてで同じ(はい)ですが、確認したかったのですが、テストケースが完全ではなかったと確信しています。

4

2 に答える 2

145

何も指定されていない場合のデフォルトのソート順は何ですか?

デフォルトの内部ソート順(または自然順)は、未定義の実装の詳細です。順序の維持はストレージエンジンの余分なオーバーヘッドであり、MongoDBのAPIは、使用制限が関連付けられているsort()固定サイズの上限付きコレクションの明示的または特殊なケース以外では予測可能性を要求しません。一般的なワークロードの場合、ストレージエンジンは、事前に割り当てられた使用可能なスペースを再利用し、データをディスクとメモリに最も効率的に保存する方法を決定することが望ましいです。

クエリ基準がない場合、結果はストレージエンジンによって自然な順序で返されます(つまり、見つかった順序で)。結果の順序は挿入の順序と一致する場合がありますが、この動作は保証されておらず、信頼できません(上限のあるコレクションを除く)。

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

  • WiredTigerは、ディスク上のドキュメントとメモリ内キャッシュで異なる表現を使用するため、内部データ構造に基づいて自然な順序が変更される場合があります。
  • 元のMMAPv1ストレージエンジン(MongoDB 4.2で削除)は、パディングルールに基づいてドキュメントにレコードスペースを割り当てます。ドキュメントが現在割り当てられているレコードスペースを超えると、ドキュメントの場所(および自然順序)が影響を受けます。新しいドキュメントは、削除または移動されたドキュメントのために再利用可能とマークされたストレージに挿入することもできます。
  • レプリケーションは、べき等のoplog形式を使用して、レプリカセットメンバー全体に一貫して書き込み操作を適用します。各レプリカセットメンバーは、自然な順序で変化する可能性のあるローカルデータファイルを維持しますが、oplog更新が適用された場合も同じデータ結果になります。

インデックスが使用されている場合はどうなりますか?

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

予測可能な並べ替え順序が必要sort()な場合は、クエリに明示的なものを含め、並べ替えキーに一意の値を設定する必要があります。

上限付きコレクションはどのように挿入順序を維持しますか?

上限付きコレクションの自然な順序で示されている実装の例外は、特別な使用制限によって強制されます。ドキュメントは挿入順序で保存されますが、既存のドキュメントサイズを大きくしたり、ドキュメントを明示的に削除したりすることはできません。注文は、最も古いドキュメントが最初に「古くなる」ことを保証する上限付きコレクション設計の一部です。

于 2012-07-22T09:55:50.060 に答える
9

保存された順序(ファイル内の順序)で返されますが、挿入された順序であるとは限りません。_idフィールドでソートされていません。挿入順序でソートされているように見える場合もありますが、別のリクエストで変更される場合があります。信頼できません。

于 2012-07-22T09:53:45.863 に答える