3

ブールフラグがあり:finishedます。するべきか

A: index({ finished: 1 })
B: index({ finished: 1 }, {sparse: true})
C: use flag :unfinished instead, to query by that
D: other?

Rubyモンゴイド構文。ほとんどの私のレコードにはfinished=trueのフラグがあり、ほとんどの操作は明らかに未完成のものをフェッチします。いつスパースを使用するか、いつ使用しないかがわかりません。ありがとう!

4

2 に答える 2

18

sparse フラグは少し奇妙です。いつ使用するかを理解するには、そもそも「スパース」が存在する理由を理解する必要があります。

1 つのフィールドに単純なインデックスを作成すると、そのフィールドを持たないドキュメントであっても、ドキュメントごとにエントリが作成されます。

たとえば、 にインデックスがある場合、そのフィールドはほとんどの場合存在しないため、{rarely_set_field : 1}ほとんどが で埋められたインデックスがあります。nullこれはスペースの無駄であり、検索するのは非効率的です。

この{sparse:true}オプションは値を取り除くため、が定義されているnull場合にのみエントリを含むインデックスを取得します。{rarely_set_field}

あなたのケースに戻ります。

ブール値+スパースの使用について質問しています。しかし、スパースは「ブール値」に実際には影響しません。スパースは「設定されているかどうか」に影響します。

あなたの場合、 fetch しようとしていますunfinished。キーを利用sparseするのはブール値ではありませんが、unfinishedエントリにはそのキーがあり、「完成した」エントリにはキーがまったくないという事実です。

{ _id: 1, data: {...}, unfinished: true }
{ _id: 2, data: {...} } // this entry is finished

キューを使用しているようです

上記の情報を利用して、スパース インデックスを実装できます。ただし、実際には Queue を使用しているように聞こえます。MongoDB はキューとして使用できます。ここに2 つの を示します。

ただし、キューを見ると、彼らはあなたがやっているようにはしていません。私は個人的にいくつかの実稼働システムのキューとして MongoDB を使用しており、かなりうまく動作しますが、専用のキューとして予想される負荷をテストすると、はるかに優れたパフォーマンスが得られます。

于 2012-06-21T05:30:12.173 に答える
2

nullスパースは、値がであり、ではない場合にのみ役立ちますfalse。「ほとんどが終わった=true」と言うとき、私はほとんどfinishedが非であると推測しているnullので、スパースはあまり有益ではありません。

また、ほとんどの値は単一の値であるため、クエリが十分に具体的である場合、どのタイプのインデックスもまったく役に立たないと思います。

于 2012-06-21T08:01:02.337 に答える