sql >> Base de Datos >  >> NoSQL >> MongoDB

Seleccione el elemento de matriz coincidente y devuelva los campos seleccionados

Si solo desea seleccionar ciertos campos de una matriz para devolver, entonces está hablando de "reformar" el documento. Para cualquier cosa más allá de la selección de campo "básica", esto significa usar .aggregate() como método en lugar de .find() .

Entonces, los dos requisitos aquí son $filter en el contenido de la matriz para "coincidir" y devolver, así como $map los "campos a devolver" reales de la propia matriz:

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

Aquí $filter se usa para reducir el contenido de la matriz a solo aquellos que coinciden con la condición. Siendo los que tienen el mismo "name" propiedad como el valor "def" . Esto luego se pasa como "input" parámetro a $map .

El $map El operador funciona como sus contrapartes de otros idiomas en el sentido de que "remodela las matrices" para devolver algo de acuerdo con lo que especifica en el "in" parámetro. Entonces, aquí en realidad solo nombramos explícitamente las propiedades y usamos las asignaciones de variables para el elemento de matriz actual que se está procesando para que estos sean los que se devuelven como el "nuevo" contenido de la matriz.

El resultado general es una matriz que contiene:

  1. Solo los elementos que cumplan las condiciones especificadas.
  2. Solo los campos que se especificaron para devolver.