Hvis du kun vil vælge bestemte felter i et array, der skal returneres, taler du om at "omforme" dokumentet. For alt andet end "grundlæggende" feltvalg betyder det brug af .aggregate()
som metoden i stedet for .find()
.
Så de to krav her er at $filter
på matrixindholdet for at "matche" og returnere, samt $map
de faktiske "felter, der skal returneres" fra selve arrayet:
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"
}
}
}
}}
])
Her $filter
bruges til at reducere indholdet af arrayet til kun dem, der matcher betingelsen. At være dem, der har det samme "name"
egenskab som værdien "def"
. Dette sendes derefter som "input"
parameter til$map
.
$map
operator fungerer ligesom det er andre sproglige modstykker, idet den "omformer arrays" for at returnere noget i henhold til det, du angiver i "in"
parameter. Så her navngiver vi faktisk kun egenskaberne eksplicit og bruger variable tildelinger for det aktuelle array-element, der behandles, så det er det, der returneres som det "nye" array-indhold.
Det overordnede resultat er et array, der indeholder:
- Kun de varer, der matcher de angivne betingelser.
- Kun de felter, der var angivet til at returnere.