A diferença no uso de projeção é um pouco sutil. Em seu exemplo de uso, estas devem ser consultas equivalentes (em termos de uso de índice), mas o
$elemMatch
exemplo repete desnecessariamente os critérios de consulta. O $
projeção seria uma escolha mais sensata para este exemplo. Uma diferença essencial observada na documentação é a matriz limitação de campo para
$
projeções:Algumas notas adicionais sobre as diferenças nos operadores de projeção abaixo ...
O posicional ($
) operador de projeção
:
-
limita o conteúdo de um campo de matriz incluído nos resultados da consulta para conter o primeiro elemento que corresponde ao documento da consulta.
-
requer que o campo de matriz correspondente seja incluído nos critérios de consulta
-
só pode ser usado se um único campo de matriz aparecer nos critérios de consulta
-
só pode ser usado uma vez em uma projeção
O $elemMatch operador de projeção
-
limita o conteúdo de um campo de matriz incluído nos resultados da consulta para conter apenas o primeiro elemento de matriz que corresponda à condição $elemMatch .
-
não requer que a matriz correspondente esteja nos critérios de consulta
-
pode ser usado para combinar várias condições para elementos de matriz que são documentos incorporados
O $elemMatch
operador de consulta
Observe que também existe um
$elemMatch
operador de consulta que executa uma correspondência semelhante, mas na consulta e não na projeção de resultados. Não é incomum ver isso usado em combinação com um $
projeção. Tomando emprestado um exemplo dos documentos onde você pode usar ambos:
db.students.find(
// use $elemMatch query operator to match multiple criteria in the grades array
{ grades: {
$elemMatch: {
mean: { $gt: 70 },
grade: { $gt: 90 }
}
}},
// use $ projection to get the first matching item in the "grades" array
{ "grades.$": 1 }
)