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

Selecione o elemento de matriz correspondente e retorne os campos selecionados


Se você deseja selecionar apenas determinados campos de uma matriz para retornar, está falando em "remodelar" o documento. Para qualquer coisa além da seleção de campo "básica", isso significa usar .aggregate() como o método em vez de .find() .

Portanto, os dois requisitos aqui são $filter no conteúdo da matriz para "corresponder" e retornar, bem como $map os "campos a serem retornados" reais da própria matriz:
User.aggregate([
  { "$match": { "children.name": "def" } },
  { "$project": {
     "name": 1,
     "children": {
       "$map": {
         "input": {
           "$filter": {
             "input": "$children",
             "as": "c",
             "cond": { "$eq": [ "$$c.name", "def" ] } 
           }
         },
         "as": "c",
         "in": {
           "age": "$$c.age",
           "height": "$$c.height"
         }
       }
     }
  }}
])

Aqui $filter é usado para reduzir o conteúdo da matriz para apenas aqueles que correspondem à condição. Sendo aqueles que possuem o mesmo "name" propriedade como o valor "def" . Isso é então passado como o "input" parâmetro para$map .

O $map O operador funciona exatamente como em outras linguagens, pois "reforma os arrays" para retornar algo de acordo com o que você especifica no "in" parâmetro. Então, aqui, na verdade, apenas nomeamos explicitamente as propriedades e usamos as atribuições de variáveis ​​para o elemento da matriz atual que está sendo processado, para que sejam retornados como o "novo" conteúdo da matriz.

O resultado geral é um array, contendo:
  1. Apenas os itens que atendem às condições especificadas.
  2. Apenas os campos que foram especificados para retornar.