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

oprettelse af dækket indeks for aggregeringsramme

For at få mest muligt ud af indekset skal du have et $match tidligt nok i pipelinen, der bruger alle felterne i indekset. Og undgå at bruge $and operatør, da det er unødvendigt og i den nuværende (2.4) version kan forårsage, at et indeks ikke bliver fuldt udnyttet (heldigvis rettet til den kommende 2.6).

Forespørgslen er dog ikke helt korrekt, da du skal bruge $elemMatch for at sikre, at det samme element bruges til at opfylde navne- og værdifelterne.

Din forespørgsel skal være:

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

Nu er det ikke vil være en dækket forespørgsel, da attributes.value og name er indlejret, for ikke at nævne det faktum, at navn ikke er i indekset.

Du skal have indekset til at være {"type":1, "attributes.value":1, "attributes.name":1} for den bedste ydeevne, selvom den stadig ikke vil blive dækket, vil den være meget mere selektiv end nu.




  1. MongoDB $geoNear aggregeringspipeline (ved at bruge forespørgselsindstillingen og bruge $match pipeline operation) giver forskellige antal resultater

  2. BadValue Ugyldig eller ingen bruger-lokalitet angivet. Sørg for, at miljøvariablerne LANG og/eller LC_* er indstillet korrekt

  3. Få flere nøgleværdier fra Redis

  4. Får timeout-fejl under tilslutning af MongoDB Atlas med Mongoose