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

364
Vistas
MongoDB encuentra el valor faltante más bajo

Tengo una colección en MongoDB que se parece a:

 { "foo": "something", "tag": 0, }, { "foo": "bar", "tag": 1, }, { "foo": "hello", "tag": 0, }, { "foo": "world", "tag": 3, }

Si consideramos este ejemplo, hay entradas en la colección con tag de valor 0 , 1 o 3 y estos no son valores únicos, el valor de tag se puede repetir. Mi objetivo es encontrar que falta 2 . ¿Hay alguna manera de hacer esto con una consulta?

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

0

consulta1

  • en el próximo mongodb 5.2 tendremos arreglos ordenados que podrían hacer esta consulta más fácilmente sin la operación de configuración, pero esto también estará bien
  • agrupar y encontrar el mínimo, máximo y todos los valores
  • tomar el range(max-min)
  • los que faltan son (setDifference range_above tags)
  • y de ellos tomas solo el más pequeño => 2

Código de prueba aquí

 aggregate( [{"$group": {"_id":null, "min":{"$min":"$tag"}, "max":{"$max":"$tag"}, "tags":{"$addToSet":"$tag"}}}, {"$project": {"_id":0, "missing": {"$min": {"$setDifference": [{"$range":[0, {"$subtract":["$max", "$min"]}]}, "$tags"]}}}}])

consulta2

  • en Mongodb 5 (la versión actual) también podemos usar $setWindowFields
  • ordene por etiqueta, agregue el rango denso (mismos valores = mismo rango) y el mínimo
  • luego encuentra la difference of tag-min
  • y luego filtre aquellos que esta difference < rank
  • y encuentre el máximo de ellos (máximo de la etiqueta que está bien)
  • aumentar 1 para encontrar el que falta

* Pruébelo antes de usarlo para estar seguro, lo probé 3-4 veces parecía estar bien, para una gran colección si tiene muchas etiquetas diferentes, creo que esto es mejor. (el addtoset anterior puede causar problemas de memoria)

Código de prueba aquí

 aggregate( [{"$setWindowFields": {"output":{"rank":{"$denseRank":{}}, "min":{"$first":"$tag"}}, "sortBy":{"tag":1}}}, {"$set":{"difference":{"$subtract":["$tag", "$min"]}}}, {"$match":{"$expr":{"$lt":["$difference", "$rank"]}}}, {"$group":{"_id":null, "last":{"$max":"$tag"}}}, {"$project":{"_id":0, "missing":{"$add":["$last", 1]}}}])
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