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 を使用しており、かなりうまく動作しますが、専用のキューとして予想される負荷をテストすると、はるかに優れたパフォーマンスが得られます。