何も指定されていない場合のデフォルトのソート順は何ですか?
デフォルトの内部ソート順(または自然順)は、未定義の実装詳細です。順序を維持することはストレージエンジンの追加のオーバーヘッドであり、MongoDBのAPIはsort()
、使用制限が関連付けられている固定サイズの上限付きコレクションの明示的または特殊なケース以外では予測可能性を要求しません。典型的なワークロードの場合、ストレージエンジンが利用可能な事前割り当て領域を再利用して、データをディスクとメモリに最も効率的に格納する方法を決定することが望ましいです。
クエリ条件がない場合、結果はストレージエンジンによって自然な順序で(つまり、見つかった順序で)返されます。結果の順序は挿入の順序と一致する場合がありますが、この動作は保証されておらず、(上限のあるコレクションを除いて)信頼することはできません。
ストレージの(自然な)順序に影響を与える可能性があるいくつかの例:
- WiredTigerは、ディスク上のドキュメントとメモリ内キャッシュのドキュメントの異なる表現を使用するため、内部のデータ構造に基づいて自然な順序が変わる場合があります。
- オリジナルのMMAPv1ストレージエンジン(MongoDB 4.2で削除)は、パディングルールに基づいてドキュメントにレコードスペースを割り当てます。ドキュメントが現在割り当てられているレコードスペースを超えると、ドキュメントの場所(および自然な順序)が影響を受けます。削除または移動されたドキュメントのために、再利用可能としてマークされたストレージに新しいドキュメントを挿入することもできます。
- レプリケーションは、べき等のoplog形式を使用して、レプリカセットメンバー全体に一貫して書き込み操作を適用します。各レプリカセットメンバーは、自然な順序で変化する可能性があるローカルデータファイルを保持しますが、oplog更新が適用されると同じデータ結果になります。
インデックスが使用されている場合はどうなりますか?
インデックスを使用すると、ドキュメントは見つかった順序で返されます(挿入順序またはI / O順序と必ず一致します)。複数のインデックスが使用されている場合、順序は重複排除プロセス中にドキュメントを最初に識別したインデックスに内部的に依存します。
予測可能な並べ替え順序が必要な場合は、sort()
クエリに明示的なものを含め、並べ替えキーに一意の値を含める必要があります。
キャップされたコレクションはどのように挿入順序を維持しますか?
上限付きコレクションでの自然順序について言及されている実装の例外は、特別な使用制限によって適用されます。ドキュメントは挿入順に保存されますが、既存のドキュメントサイズを大きくしたり、ドキュメントを明示的に削除したりすることはできません。順序付けは、最も古いドキュメントが最初に「期限切れ」になるように制限されたコレクションデザインの一部です。