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:
- Apenas os itens que atendem às condições especificadas.
- Apenas os campos que foram especificados para retornar.