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

142
Vistas
Encuentre el valor máximo en la matriz anidada MongoDB

Tengo una colección con matrices anidadas como se muestra a continuación:

 [ { "title":"Foo", "arr":[ [ { "value":"2021-11-13T00:00:00.000Z", "baz":10 }, { "value":"2021-11-12T00:00:00.000Z", "baz":0 } ] ] }, { "title":"Bar", "arr":[ [ { "value":"2021-12-03T00:00:00.000Z", "baz":10 }, { "value":"2021-12-07T00:00:00.000Z", "baz":0 } ] ] } ]

Quiero filtrar el valor más grande (es decir, la última fecha) para cada documento de modo que el resultado sea:

 [ { "title": "Foo", "value": "2021-11-13T00:00:00.000Z", }, { "title": "Bar", "value": "2021-12-07T00:00:00.000Z", }, ]

¿Cómo se puede escribir esta consulta?

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

0

consulta1

  • encuentre el máximo local en las matrices internas
  • encuentre el máximo global en las matrices externas

Código de prueba aquí

 aggregate( [{"$set": {"value": {"$max": {"$map": {"input": "$arr", "in": {"$max": "$$this.value"}}}}}}, {"$unset": ["_id", "arr"]}])

consulta2

  • esto aplana la matriz para que no se anide y toma el máximo después
  • reduce y concatArrays para hacer que la matriz anidada sea una matriz no anidada
  • tomar el max para cada matriz
  • proyecto para mantener solo esos 2 campos como salida esperada

Código de prueba aquí

 aggregate( [{"$set": {"arr": {"$reduce": {"input": "$arr", "initialValue": [], "in": {"$concatArrays": ["$$value", "$$this"]}}}}}, {"$set": {"value": {"$max": "$arr.value"}}}, {"$project": {"_id": 0, "title": 1, "value": 1}}])
over 4 years ago · Santiago Trujillo Denunciar

0

En lugar de $reduce , también puede usar $filter y $map :

 db.collection.aggregate([ { $set: { arr: { $map: { input: "$arr", as: "item", in: { $filter: { input: "$$item", cond: { $eq: ["$$this.baz", { $max: "$$item.baz" }] } } } } } } } ])

No está claro por qué tiene una matriz arr con solo un elemento. Si su colección siempre tiene un solo elemento elemento en arr , entonces también puede omitir el $map

 db.collection.aggregate([ { $set: { arr: { $let: { vars: { item: { $first: "$arr" } }, in: { $filter: { input: "$$item", cond: { $eq: ["$$this.value", { $max: "$$item.value" }] } } } } } } } ])
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