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

Ordinamento su più campi mongo DB

L'ottimizzatore di query MongoDB funziona provando diversi piani per determinare quale approccio funziona meglio per una determinata query. Il piano vincente per quel modello di query viene quindi memorizzato nella cache per le successive circa 1.000 query o finché non esegui un explain() .

Per capire quali piani di query sono stati presi in considerazione, dovresti utilizzare explain(1) , ad esempio:

db.col.find({category:'A'}).sort({updated: -1}).explain(1)

Il allPlans i dettagli mostreranno tutti i piani che sono stati confrontati.

Se esegui una query non molto selettiva (ad esempio, se molti record corrispondono ai tuoi criteri di {category: { $ne:'A'}} ), potrebbe essere più veloce per MongoDB trovare i risultati utilizzando un BasicCursor (scansione tabella) anziché confrontarli con un indice.

L'ordine dei campi nella query generalmente non fa differenza per la selezione dell'indice (ci sono alcune eccezioni con le query di intervallo). L'ordine dei campi in un ordinamento influisce sulla selezione dell'indice. Se il tuo sort() i criteri non corrispondono all'ordine dell'indice, i dati del risultato devono essere riordinati dopo che l'indice è stato utilizzato (dovresti vedere scanAndOrder:true nell'output di spiegazione se ciò accade).

Vale anche la pena notare che MongoDB utilizzerà un solo indice per query (ad eccezione di $or s).

Quindi, se stai cercando di ottimizzare la query:

db.col.find({category:'A'}).sort({updated: -1, rating: -1})

Dovrai includere tutti e tre i campi nell'indice:

db.col.ensureIndex({category: 1, updated: -1, rating: -1})

Cordiali saluti, se vuoi forzare una query particolare a utilizzare un indice (generalmente non necessario o consigliato), c'è un hint() opzione che puoi provare.