スパースフラグは少し奇妙です。いつ使用するかを理解するには、そもそも「スパース」が存在する理由を理解する必要があります。
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を一部の本番システムのキューとして使用しており、かなりうまく動作しますが、専用のキューの方がはるかにパフォーマンスが高いため、予想される負荷をテストしてください。