MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

criando índice coberto para estrutura de agregação


Para obter o máximo do índice, você precisa ter uma $match suficientemente cedo no pipeline que use todos os campos do índice. E evite usar $and pois é desnecessário e na versão atual (2.4) pode fazer com que um índice não seja totalmente utilizado (felizmente corrigido para o próximo 2.6).

No entanto, a consulta não está correta, pois você precisa usar $elemMatch para garantir que o mesmo elemento seja usado para satisfazer os campos de nome e valor.

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

Agora, não vai ser uma consulta coberta, já que os atributos.valor e nome estão embutidos, sem mencionar o fato de que o nome não está no índice.

Você precisa que o índice seja {"type":1, "attributes.value":1, "attributes.name":1} para melhor desempenho, embora ainda não seja coberto, será muito mais seletivo do que agora.