Om du bara vill välja vissa fält i en array att returnera så talar du om att "omforma" dokumentet. För allt utöver "grundläggande" fältval betyder det att du använder .aggregate()
som metoden istället för .find()
.
Så de två kraven här är att $filter
på arrayinnehållet för att "matcha" och returnera, samt $map
de faktiska "fälten att returnera" från själva arrayen:
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"
}
}
}
}}
])
Här $filter
används för att reducera innehållet i arrayen till endast de som matchar villkoret. Att vara de som har samma "name"
egenskap som värdet "def"
. Detta skickas sedan som "input"
parameter till$map
.
$map
operatorn fungerar precis som andra språkmotsvarigheter genom att den "omformar arrayer" för att returnera något enligt vad du anger i "in"
parameter. Så här namnger vi faktiskt bara egenskaperna explicit och använder där variabeltilldelningar för det aktuella arrayelementet som bearbetas så att dessa är vad som returneras som det "nya" arrayinnehållet.
Det övergripande resultatet är en array som innehåller:
- Bara de föremål som matchar de angivna villkoren.
- Bara de fält som angavs att returnera.