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

creazione di un indice coperto per il framework di aggregazione

Per ottenere il massimo dall'indice è necessario disporre di una corrispondenza $ abbastanza presto nella pipeline che utilizzi tutti i campi nell'indice. Ed evita di usare $and operatore poiché non è necessario e nella versione corrente (2.4) può causare il mancato utilizzo completo di un indice (fortunatamente risolto per la prossima 2.6).

Tuttavia, la query non è del tutto corretta poiché è necessario utilizzare $elemMatch per assicurarsi che lo stesso elemento venga utilizzato per soddisfare i campi nome e valore.

La tua domanda dovrebbe essere:

db.Phone.aggregate([
{$match: {  type: "Samsung", 
           attributes: { $all: [
                {$elemMatch: {"value":"100", "type" : "BatteryLife" }},
                {$elemMatch: {"value":"200$", "type" : "Price" }}
           ] }
        }
}]);

Ora, non sarà una query coperta, poiché gli attributi.value e name sono incorporati, per non parlare del fatto che il nome non è nell'indice.

È necessario che l'indice sia {"type":1, "attributes.value":1, "attributes.name":1} per le migliori prestazioni, anche se non sarà ancora coperto, sarà molto più selettivo di adesso.