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