Jeśli chcesz wybrać tylko niektóre pola tablicy do zwrócenia, mówisz o „przekształceniu” dokumentu. W przypadku wszystkiego, co wykracza poza „podstawowy” wybór pól, oznacza to użycie .aggregate()
jako metoda zamiast .find()
.
Zatem dwa wymagania to $filter
na zawartości tablicy do „dopasowania” i zwrócenia, a także $map
rzeczywiste "pola do zwrócenia" z samej tablicy:
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"
}
}
}
}}
])
Tutaj $filter
jest używany w celu zmniejszenia zawartości tablicy tylko do tych, które spełniają warunek. Będąc tymi, którzy mają to samo "name"
właściwość jako wartość "def"
. Jest to następnie przekazywane jako "input"
parametr $map
.
$map
Operator działa tak samo, jak jego odpowiedniki w innych językach, ponieważ "przekształca tablice", aby zwrócić coś zgodnie z tym, co określisz w "in"
parametr. Tak więc tutaj w rzeczywistości tylko jawnie nazywamy właściwości i używamy tam przypisań zmiennych dla bieżącego przetwarzanego elementu tablicy, tak aby były one zwracane jako "nowa" zawartość tablicy.
Ogólnym wynikiem jest tablica zawierająca:
- Tylko przedmioty spełniające określone warunki.
- Tylko pola, które zostały określone do zwrócenia.