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

$projeção vs $elemMatch


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 }
)