MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

création d'un index couvert pour le cadre d'agrégation

Pour tirer le meilleur parti de l'index, vous devez avoir un $match assez tôt dans le pipeline qui utilise tous les champs de l'index. Et évitez d'utiliser $and car il est inutile et dans la version actuelle (2.4) peut empêcher un index d'être pleinement utilisé (heureusement corrigé pour la prochaine version 2.6).

Cependant, la requête n'est pas tout à fait correcte car vous devez utiliser $elemMatch pour s'assurer que le même élément est utilisé pour satisfaire les champs de nom et de valeur.

Votre requête doit être :

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

Maintenant, ce n'est pas va être une requête couverte, puisque les attributs.value et name sont incorporés, sans parler du fait que name n'est pas dans l'index.

Vous avez besoin que l'index soit {"type":1, "attributes.value":1, "attributes.name":1} pour de meilleures performances, bien qu'il ne soit toujours pas couvert, il sera beaucoup plus sélectif que maintenant.