Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

106
Vistas
Cómo enumerar solo subdocumentos coincidentes en Mongoose

Soy nuevo en mangosta. Intenté muchas consultas pero no pude obtener el resultado correcto. Mi esquema se ve así:

 { course_name: "Test 1", students: [ {name: "Sam", age: 5}, {name: "Don", age: 7} ] }, { course_name: "Test 2", students: [ {name: "Paul", age: 7} ] }

En este ejemplo tengo 2 documentos. Cada documento del curso contiene datos de los estudiantes dentro de él. Estoy tratando de encontrar a todos los estudiantes en todos los cursos que tengan 7 años. Pero en las consultas que intenté, también devuelve a Sam.

Aquí hay un ejemplo de lo que estoy esperando:

 {name: "Paul", age: 7}, {name: "Don", age: 7}

Y esto es lo que obtengo.

 {name: "Paul", age: 7}, {name: "Sam", age: 5}, {name: "Don", age: 7}

mi consulta:

 const getStudents = await Courses.aggregate([ {$match: {'students.age': myAge}}, {$unwind: '$students'}, {$project: {name: '$students.name', age: '$students.age'}} ]);

Gracias por tu tiempo

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Es un error común pensar que si hace coincidir un valor anidado (en este caso students.age ) obtendrá el valor anidado que desea, pero no funciona así.

Está haciendo una consulta de $match antes $unwind , por lo que está obteniendo todos los documentos donde existe cualquier objeto en la matriz de students donde la age es 7. Es decir, todo el documento 1 pasa a la siguiente etapa. Los students de la matriz con dos valores van a la siguiente etapa porque uno de ellos coincide con los criterios y luego, el objeto coincide.

Entonces, para ser más claro, estás haciendo una etapa de $match donde dices: "Dame todos los documentos donde exista un estudiante de 7 años". Luego, el primer documento coincide con los criterios porque uno de los estudiantes coincide con el filtro y se devuelve el documento completo, no solo el objeto de la matriz que coincide.

Puede hacer coincidir después del desenrollado y obtendrá el resultado deseado.

Ejemplo aquí

over 4 years ago · Santiago Trujillo Denunciar

0

@JF hace un buen trabajo al explicar por qué su enfoque no es correcto. De todos modos, quiero mostrarte cómo puedes lograr el mismo resultado usando el filtro $.

Selecciona un subconjunto de una matriz para devolver en función de la condición especificada. Devuelve una matriz con solo aquellos elementos que coinciden con la condición. Los elementos devueltos están en el orden original.

 db.collection.aggregate({ $addFields: { students: { $filter: { input: "$students", as: "student", cond: { $eq: [ "$$student.age", 7 ] } } } } })

Resultado:

 [ { "_id": ObjectId("5a934e000102030405000000"), "course_name": "Test 1", "students": [ { "age": 7, "name": "Don" } ] }, { "_id": ObjectId("5a934e000102030405000001"), "course_name": "Test 2", "students": [ { "age": 7, "name": "Paul" } ] } ]
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda