スパースフラグは少し奇妙です。いつ使用するかを理解するには、そもそも「スパース」が存在する理由を理解する必要があります。
1つのフィールドに単純なインデックスを作成すると、そのフィールドがないドキュメントであっても、ドキュメントごとにエントリがあります。
たとえば、{rarely_set_field : 1}にインデックスがある場合 、ほとんどがnullで埋められたインデックスが作成されます ほとんどの場合、そのフィールドは存在しないためです。これはスペースの無駄であり、検索するのは非効率的です。
{sparse:true} オプションはnullを取り除きます 値なので、{rarely_set_field}の場合にのみエントリを含むインデックスを取得します 定義されています。
ケースに戻ります。
ブール値+スパースの使用について質問しています。ただし、スパースは実際には「ブール値」に影響を与えません。スパースは「設定されているか設定されていないか」に影響します。
あなたの場合、unfinishedをフェッチしようとしています 。 sparseを活用するには 重要なのはブール値ではなく、unfinishedという事実です。 エントリにはそのキーがあり、その「終了した」エントリにはキーがまったくありません。
{ _id: 1, data: {...}, unfinished: true }
{ _id: 2, data: {...} } // this entry is finished
キューを使用しているようです
上記の情報を確実に活用して、スパースインデックスを実装できます。ただし、実際にはキューを使用しているように聞こえます。 MongoDBはキューとして使用できます。ここに、2つ 例 。
ただし、キューを見ると、彼らはあなたがしているようにそれをしていません。私は個人的にMongoDBを一部の本番システムのキューとして使用しており、かなりうまく動作しますが、専用のキューの方がはるかにパフォーマンスが高いため、予想される負荷をテストしてください。