La bandiera sparse è un po' strana. Per capire quando usarlo, devi prima capire perché esiste "sparse".
Quando crei un semplice indice su un campo, c'è una voce per ogni documento, anche i documenti che non hanno quel campo.
Ad esempio, se hai un indice su {rarely_set_field : 1}
, avrai un indice riempito principalmente con null
perché quel campo non esiste nella maggior parte dei casi. Questo è uno spreco di spazio ed è inefficiente cercare.
Il {sparse:true}
l'opzione eliminerà il null
valori, quindi ottieni un indice che contiene solo voci quando {rarely_set_field}
è definito.
Torna al tuo caso.
Stai chiedendo di usare un booleano + sparse. Ma sparse non influisce realmente su "booleano", sparse su "è impostato vs. non è impostato".
Nel tuo caso, stai cercando di recuperare unfinished
. Per sfruttare sparse
la chiave non è il valore booleano, ma il fatto che unfinished
le voci hanno quella chiave e quelle voci "finite" non hanno alcuna chiave.
{ _id: 1, data: {...}, unfinished: true }
{ _id: 2, data: {...} } // this entry is finished
Sembra che tu stia utilizzando una coda
Puoi sicuramente sfruttare le informazioni di cui sopra per implementare un indice sparso. Tuttavia, in realtà sembra che tu stia utilizzando una coda. MongoDB è utilizzabile come coda, ecco due esempi .
Tuttavia, se guardi la coda, non lo stanno facendo nel modo in cui lo stai facendo tu. Personalmente sto usando MongoDB come coda per alcuni sistemi di produzione e funziona abbastanza bene, ma testare il carico previsto come coda dedicata funzionerà molto meglio.