Рядкото знаме е малко странно. За да разберете кога да го използвате, трябва да разберете защо "sparse" съществува на първо място.
Когато създадете прост индекс на едно поле, има запис за всеки документ, дори документи, които нямат това поле.
Например, ако имате индекс на {rarely_set_field : 1}
, ще имате индекс, който е попълнен предимно с null
защото това поле в повечето случаи не съществува. Това е загуба на място и е неефективно за търсене.
{sparse:true}
опцията ще се отърве от null
стойности, така че получавате индекс, който съдържа само записи, когато {rarely_set_field}
е дефинирано.
Назад към вашия случай.
Вие питате за използването на boolean + sparse. Но sparse всъщност не засяга "булева стойност", sparse засяга "е зададено срещу не е зададено".
Във вашия случай се опитвате да извлечете unfinished
. За да използвате sparse
ключът не е булевата стойност, а фактът, че unfinished
записите имат този ключ, а тези "завършени" записи изобщо нямат ключ.
{ _id: 1, data: {...}, unfinished: true }
{ _id: 2, data: {...} } // this entry is finished
Изглежда, че използвате опашка
Определено можете да използвате информацията по-горе, за да приложите разреден индекс. Всъщност обаче изглежда, че използвате опашка. MongoDB може да се обслужва като опашка, ето две примери .
Въпреки това, ако погледнете опашката, те не го правят по начина, по който го правите вие. Аз лично използвам MongoDB като опашка за някои производствени системи и тя работи доста добре, но тествайте очакваното натоварване, тъй като специалната опашка ще се представи много по-добре.