Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

114
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda