sql >> Base de Datos >  >> NoSQL >> MongoDB

creando un índice cubierto para el marco de agregación

Para aprovechar al máximo el índice, debe tener una $coincidencia lo suficientemente temprana en la canalización que use todos los campos del índice. Y evita usar $and ya que es innecesario y en la versión actual (2.4) puede hacer que un índice no se utilice por completo (afortunadamente solucionado para la próxima versión 2.6).

Sin embargo, la consulta no es del todo correcta ya que necesita usar $elemMatch para asegurarse de que se utiliza el mismo elemento para satisfacer los campos de nombre y valor.

Su consulta debe ser:

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

Ahora, es no va a ser una consulta cubierta, ya que los atributos, el valor y el nombre están incrustados, sin mencionar el hecho de que el nombre no está en el índice.

Necesita que el índice sea {"type":1, "attributes.value":1, "attributes.name":1} para obtener el mejor rendimiento, aunque todavía no estará cubierto, será mucho más selectivo que ahora.