Als je alleen bepaalde velden van een array wilt selecteren om te retourneren, dan heb je het over het "hervormen" van het document. Voor alles wat verder gaat dan "basis" veldselectie, betekent dit het gebruik van .aggregate()
als de methode in plaats van .find()
.
Dus de twee vereisten hier zijn om $filter
op de array-inhoud om te "matchen" en terug te geven, evenals $map
de daadwerkelijke "te retourneren velden" van de array zelf:
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"
}
}
}
}}
])
Hier $filter
wordt gebruikt om de inhoud van de array terug te brengen tot alleen de inhoud die overeenkomt met de voorwaarde. Zijn degenen die dezelfde "name"
. hebben eigenschap als de waarde "def"
. Dit wordt dan doorgegeven als de "input"
parameter to$map
.
De $map
operator werkt net als zijn tegenhangers in andere talen, omdat het "arrays hervormt" om iets terug te geven volgens wat u opgeeft in de "in"
parameter. Dus hier noemen we eigenlijk alleen de eigenschappen expliciet en gebruiken de variabele toewijzingen voor het huidige array-element dat wordt verwerkt, zodat deze worden geretourneerd als de "nieuwe" array-inhoud.
Het algemene resultaat is een array, met daarin:
- Alleen de items die voldoen aan de opgegeven voorwaarden.
- Alleen de velden die zijn opgegeven om te retourneren.