1

時系列データをセッション ドキュメントにまとめることを検討しています。各セッション内には、一連のイベントがあります。各イベントにはタイムスタンプがあります。これらのイベントのタイムスタンプでマルチキー インデックスを作成できることはわかっていますが、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" } ] }

AMongoは、カーソル内の 3 番目の結果としてドキュメントが 2 回目に表示されるのをどのように防ぎますか? 小さなインデックス スキャンの場合は、どのドキュメントが既に表示されたかを追跡できますが、インデックスが膨大な場合はどうなるでしょうか。同じドキュメントが単一のカーソルに複数回表示される場合はありますか?

私の仮定は、そうではないということです。Mongo は、スキャンしているドキュメントを見て、インデックス付き配列内の以前のエントリを調べることで、スキャンの早い段階で既に一致していたことを検出できます。ただし、MongoDB のドキュメントではこの動作について言及されていないため、実際に何が起こるかを知ることが重要です。

(注:カーソルがスキャンされている間にドキュメントが変更された場合、ドキュメントが単一のクエリに複数回表示される可能性があることは知ってます。これは、時系列データに対するクエリでは問題になりません。スキャン中に新しいイベントがセッションに追加されたとしても、Mongo が上記の検出メカニズムのようなものを使用すれば、移動したドキュメントをクエリ結果から除外できるはずです。)

4

1 に答える 1

0

MongoDB のドキュメントでこの動作についての言及を見つけることができず、実際に何が起こるかを知ることが重要です。

実装の内部がドキュメントで言及されることはめったにありません。結局のところ、あなたが説明することは期待される動作です。

結果セットの重複を排除するコードと、それが正しく機能していることを確認するためのテストがあります。結局のところ、マルチキー インデックスはそのような機能の主要なユース ケースではありません。クエリに$orがある場合は、結果も重複排除する必要があります。

于 2013-11-06T22:34:53.417 に答える