sql >> Databasteknik >  >> NoSQL >> MongoDB

skapa täckt index för aggregeringsramverk

För att få ut det mesta av indexet måste du ha en $match tillräckligt tidigt i pipelinen som använder alla fält i indexet. Och undvik att använda $and operatör eftersom det är onödigt och i den nuvarande (2.4) versionen kan göra att ett index inte utnyttjas fullt ut (lyckligtvis fixat för den kommande 2.6).

Frågan är dock inte helt korrekt eftersom du behöver använda $elemMatch för att se till att samma element används för att uppfylla namn- och värdefälten.

Din fråga bör vara:

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

Nu är det inte kommer att vara en täckt fråga, eftersom attributes.value och name är inbäddade, för att inte tala om det faktum att namnet inte finns i indexet.

Du behöver indexet vara {"type":1, "attributes.value":1, "attributes.name":1} för bästa prestanda, även om det fortfarande inte kommer att täckas, kommer det att vara mycket mer selektivt än nu.




  1. MongoDb $addFields och $match

  2. hur man lägger till nya fält i solr-schemat

  3. redis lagra 128 bitars nummer

  4. Mongoose dokumentreferenser med en en-till-många-relation