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

100
Vistas
Mongodb encuentra las puntuaciones más altas de los dos exámenes

Tengo una colección de estudiantes que se ve así: Cómo encontrar un máximo de dos puntajes de examen para cada estudiante

 [ { "_id" : ObjectId("61868aa03b2fe72b58c891a5"), "name" : "Max", "examScores" : [ { "difficulty" : 4, "score" : 57.9 }, { "difficulty" : 6, "score" : 62.1 }, { "difficulty" : 3, "score" : 88.5 } ] }, { "_id" : ObjectId("61868aa03b2fe72b58c891a6"), "name" : "Manu", "examScores" : [ { "difficulty" : 7, "score" : 52.1 }, { "difficulty" : 2, "score" : 74.3 }, { "difficulty" : 5, "score" : 53.1 } ] } ]

Quiero usar la agregación para devolver los dos examScores.score más altos de esta manera:

 [ { name: "Max", maxExams: [88.5, 62.1] }, { name: "Manu", maxExams: [74.3, 53.1] } ]

Intenté la etapa de agregación $proyecto y $desenrollado y $clasificación, pero ninguno de ellos resuelve mi problema

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Aquí está:

 mongos> db.s.aggregate([ {$unwind:"$examScores"}, {$sort:{"name":1,"examScores.score":-1}}, {$group:{ _id:"$name" ,Scores:{$push:"$examScores.score"} }}, {$project:{_id:0,name:"$_id",maxExam:{$slice:["$Scores",2]}}} ]) { "name" : "Manu", "maxExam" : [ 74.3, 53.1 ] } { "name" : "Max", "maxExam" : [ 88.5, 62.1 ] } mongos>

Explicado:

  1. Desenrolle las partituras para que pueda ordenarlas más tarde.
  2. Ordenar por nombre y puntajes de máximo a mínimo
  3. agrupa las puntuaciones en una nueva matriz Scores
  4. proyecte el nombre y maxExam (cortados los primeros 2 de Scores)
about 4 years ago · Juan Pablo Isaza Denunciar

0

Consulta

  • puede reducir y mantener solo el máximo de 2 puntajes
  • comienza con [-1,-1] si el puntaje >= el primer miembro agrega a la izquierda (se eliminará el derecho anterior), de lo contrario, si el puntaje> = el segundo miembro agrega a la derecha (se eliminará el derecho anterior), de lo contrario no haga nada
  • si quisieras más de 2-3
    • si MongoDB 5 se podría $setWindowFields
    • de lo contrario, relájese en la solución del segmento 2 del grupo

*aquí no necesitas desconectar/agrupar/ordenar, etc. porque solo 2.

JugarMongo

 aggregate( [{"$project": {"_id": 0, "name": 1, "maxExams": {"$reduce": {"input": "$examScores", "initialValue": [-1, -1], "in": {"$switch": {"branches": [{"case": {"$gte": ["$$this.score", {"$arrayElemAt": ["$$value", 0]}]}, "then": {"$concatArrays": [["$$this.score"], [{"$arrayElemAt": ["$$value", 0]}]]}}, {"case": {"$gte": ["$$this.score", {"$arrayElemAt": ["$$value", 1]}]}, "then": {"$concatArrays": [[{"$arrayElemAt": ["$$value", 0]}], ["$$this.score"]]}}], "default": "$$value"}}}}}}])
about 4 years ago · Juan Pablo Isaza 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