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