MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Dovrei usare l'indice sparse per i flag booleani in mongodb?

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.