MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Seleziona Elemento array corrispondente e restituisci i campi selezionati

Se vuoi selezionare solo alcuni campi di un array da restituire, stai parlando di "rimodellare" il documento. Per qualsiasi cosa oltre alla selezione del campo "di base", ciò significa utilizzare .aggregate() come metodo invece di .find() .

Quindi i due requisiti qui sono $filter sul contenuto dell'array per "corrispondere" e restituire, nonché $map i "campi da restituire" effettivi dall'array stesso:

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"
         }
       }
     }
  }}
])

Qui $filter viene utilizzato per ridurre il contenuto dell'array solo a quelli che soddisfano la condizione. Essendo quelli che hanno lo stesso "name" proprietà come valore "def" . Questo viene quindi passato come "input" parametro a$map .

Il $map l'operatore funziona proprio come le sue controparti di altre lingue in quanto "rimodella gli array" per restituire qualcosa in base a ciò che specifichi in "in" parametro. Quindi qui in realtà denominiamo esplicitamente solo le proprietà e utilizziamo le assegnazioni di variabili per l'elemento dell'array corrente in elaborazione in modo che questi siano ciò che viene restituito come il "nuovo" contenuto dell'array.

Il risultato complessivo è un array, contenente:

  1. Solo gli articoli che soddisfano le condizioni specificate.
  2. Solo i campi specificati da restituire.