プライマリインデックスがRDBMSテーブルのデータを順序付ける方法と同様に、mongodbのデータの自然な順序を指定する方法はありますか?
私のユースケースは、すべてのクエリが日付フィールド(誕生日など)でソートされたデータを返すことです。MongoDB:Sorting and Natural Orderによると、標準の(上限のない)コレクションの自然な順序は、おおよそ挿入順序ですが、保証されていません。これは、データの取得後に並べ替えが必要であることを意味します。
プライマリインデックスがRDBMSテーブルのデータを順序付ける方法と同様に、mongodbのデータの自然な順序を指定する方法はありますか?
私のユースケースは、すべてのクエリが日付フィールド(誕生日など)でソートされたデータを返すことです。MongoDB:Sorting and Natural Orderによると、標準の(上限のない)コレクションの自然な順序は、おおよそ挿入順序ですが、保証されていません。これは、データの取得後に並べ替えが必要であることを意味します。
RDBMSのプライマリインデックスのように機能するものを探している場合は、_idで並べ替えます。_idの前にタイムスタンプが付いているため、大まかに挿入順序になります。$ natural orderを使用しようとすると、インデックスが失われます。
あなたが言及しているのは、プライマリインデックスではなく、クラスタ化されたインデックスだと思います。
MongoDB 2.0にはクラスター化されたインデックス機能がないため、日付の通常のインデックスが最も効率的な取得オプションになります。
MongoDBを使用してディスク上の物理的な順序を考えるのは、おそらく時期尚早の最適化です。MongoDBはメモリマップトファイルを使用するため、ワーキングセット+クエリ+ RAMによっては、ディスクからデータを期待どおりにロードする必要がない場合があります。
また、別の日付フィールドに依存するのではなく、ドキュメントIDに組み込まれているタイムスタンプを使用することを検討する必要があることを付け加えておきます。これにより、保存するデータが少なくなり、インデックスが削除されます。
ジェイソンモンゴ本社
インデックスの助けがなければ、あなたが望むことを達成するのは難しいでしょう。シャーディングをサポートするために、MongoDBの_idフィールドは、ドキュメントが作成された時点のタイムスタンプに基づいて値を取ります。結果として、RDBMSテーブルのID列とは異なり、単調に増加させることはできません。すべてのクエリが誕生日順にソートされたドキュメントを返す場合は、誕生日列にインデックスを作成する必要があると思います。インデックスが作成されると、クエリは十分に効率的になります。
これを参照してください:
MongoDBの上限付きコレクションと単調に増加するインデックス