Si vous souhaitez uniquement sélectionner certains champs d'un tableau à renvoyer, vous parlez de "remodeler" le document. Pour tout ce qui va au-delà de la sélection de champ "de base", cela signifie utiliser .aggregate()
comme méthode au lieu de .find()
.
Donc, les deux exigences ici sont de $filter
sur le contenu du tableau pour "faire correspondre" et retourner, ainsi que $map
les "champs à renvoyer" réels du tableau lui-même :
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"
}
}
}
}}
])
Ici $filter
est utilisé pour réduire le contenu du tableau à ceux qui correspondent à la condition. Être ceux qui ont le même "name"
propriété comme valeur "def"
. Ceci est ensuite passé comme "input"
paramètre à$map
.
Le $map
L'opérateur fonctionne comme ses homologues d'autres langages en ce sens qu'il "reforme les tableaux" pour renvoyer quelque chose en fonction de ce que vous spécifiez dans le "in"
paramètre. Donc, ici, nous ne nommons explicitement que les propriétés et n'utilisons que les affectations de variables pour l'élément de tableau en cours de traitement afin qu'elles soient renvoyées en tant que "nouveau" contenu de tableau.
Le résultat global est un tableau contenant :
- Seulement les éléments correspondant aux conditions spécifiées.
- Seulement les champs spécifiés à renvoyer.