Pokud chcete vybrat pouze určitá pole pole, která se mají vrátit, pak mluvíte o „přetvoření“ dokumentu. Pro cokoli nad rámec „základního“ výběru pole to znamená použití .aggregate()
jako metoda namísto .find()
.
Zde jsou tedy dva požadavky:$filter
na obsahu pole, aby se „srovnal“ a vrátil, stejně jako $map
skutečná "pole k návratu" ze samotného pole:
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"
}
}
}
}}
])
Zde $filter
se používá k redukci obsahu pole pouze na ty, které odpovídají podmínce. Jsou to ty, které mají stejné "name"
vlastnost jako hodnotu "def"
. Toto je pak předáno jako "input"
parametr na $map
.
$map
Operátor funguje stejně jako jeho protějšky v jiných jazycích v tom, že "přetváří pole" tak, aby vrátilo něco podle toho, co zadáte v "in"
parametr. Takže zde ve skutečnosti pouze explicitně pojmenujeme vlastnosti a použijeme tam přiřazení proměnných pro aktuální prvek pole, který se zpracovává, takže to jsou to, co se vrátí jako "nový" obsah pole.
Celkovým výsledkem je pole obsahující:
- Pouze položky odpovídající zadaným podmínkám.
- Pouze pole, která se mají vrátit.