Ако искате да изберете само определени полета от масив, които да върнете, тогава говорите за „преоформяне“ на документа. За всичко извън „основния“ избор на поле, това означава използване на .aggregate()
като метод вместо .find()
.
Така че двете изисквания тук са $filter
върху съдържанието на масива за „съвпадение“ и връщане, както и $map
действителните „полета за връщане“ от самия масив:
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"
}
}
}
}}
])
Тук $filter
се използва, за да се намали съдържанието на масива само до тези, които отговарят на условието. Като тези, които имат едно и също "name"
свойството като стойността "def"
. След това това се предава като "input"
параметър към$map
.
$map
операторът работи точно като други езикови аналогове, тъй като „преоформя масиви“, за да върне нещо според това, което сте посочили в "in"
параметър. Така че тук всъщност само изрично наименуваме свойствата и използваме там присвояване на променливи за текущия елемент на масива, който се обработва, така че те да са това, което се връща като „ново“ съдържание на масива.
Общият резултат е масив, съдържащ:
- Само елементите, отговарящи на посочените условия.
- Само полетата, които са посочени за връщане.