時系列データをセッション ドキュメントにまとめることを検討しています。各セッション内には、一連のイベントがあります。各イベントにはタイムスタンプがあります。これらのイベントのタイムスタンプでマルチキー インデックスを作成できることはわかっていますが、1 つのクエリで同じドキュメントが 2 回表示されるのを防ぐために MongoDB がどのようなメカニズムを使用しているかに興味があります。
明確にするために、次のドキュメントを含むセッションのコレクションを想像してください。
{
_id: 'A',
events: [
{time: '10:00'},
{time: '15:00'}
]
}
{
_id: 'B',
events: [
{time: '12:00'}
]
}
でマルチキー インデックスを追加するとdb.sessions.ensureIndex({'events.time' : 1})
、そのインデックスの B ツリーは次のようになります。
'10:00' => 'A'
'12:00' => 'B'
'15:00' => 'A'
でコレクションをクエリすると{'events.time': {$gte: '10:00'}}
、MongoDB は b ツリーをスキャンして次を返します。
{ "_id" : "A", "events" : [ { "time" : "10:00" }, { "time" : "15:00" } ] }
{ "_id" : "B", "events" : [ { "time" : "12:00" } ] }
A
Mongoは、カーソル内の 3 番目の結果としてドキュメントが 2 回目に表示されるのをどのように防ぎますか? 小さなインデックス スキャンの場合は、どのドキュメントが既に表示されたかを追跡できますが、インデックスが膨大な場合はどうなるでしょうか。同じドキュメントが単一のカーソルに複数回表示される場合はありますか?
私の仮定は、そうではないということです。Mongo は、スキャンしているドキュメントを見て、インデックス付き配列内の以前のエントリを調べることで、スキャンの早い段階で既に一致していたことを検出できます。ただし、MongoDB のドキュメントではこの動作について言及されていないため、実際に何が起こるかを知ることが重要です。
(注:カーソルがスキャンされている間にドキュメントが変更された場合、ドキュメントが単一のクエリに複数回表示される可能性があることは知っています。これは、時系列データに対するクエリでは問題になりません。スキャン中に新しいイベントがセッションに追加されたとしても、Mongo が上記の検出メカニズムのようなものを使用すれば、移動したドキュメントをクエリ結果から除外できるはずです。)