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

167
Vistas
Extraer rangos de valores secuenciales

Tarea 1:

Tengo mi colección con documentos en mongodb con valor de rangos secuenciales de la siguiente manera:

 {x:1} {x:2} {x:3} {x:5} {x:6} {x:7} {x:8} {x:20} {x:21}

Necesito extraer una lista de rangos secuenciales en el formulario (el conteo no es obligatorio, pero necesito al menos el primer y último valor del rango):

 {x:[1,3] , count:3} {x:[5,8], count:4} {x:[20,21],count:2}

o

 { min:1 , max:3 , count:3} { min:5 , max:8 , count:4} { min:20 , max:21 , count:2}

Por favor, aconseje una solución adecuada, la colección tiene ~ 100 millones de documentos, algunos de los valores están en rangos de 10 dígitos, otros en rangos de 15 dígitos, pero ¿todos son secuencialmente incrementales en su rango?

Tarea 2:

Piense lo mismo que en la Tarea 1, pero basado en el paso de secuencia personalizado, por ejemplo, si el paso de secuencia es 3:

 {y:1} {y:3} {y:5} {y:20} {y:22}

necesidad de producir:

 {y:[1,5] ,count:3} {y:[20,22]} , count:2}

¡Gracias!

PD: logré parcialmente obtener una imagen de rangos por distribución de búsqueda por rango de número de dígitos, pero esto parece ser muy general:

 db.collection.aggregate([ { $addFields: { range: { $strLenCP: { $toString: "$x" } } } }, { $group: { _id: "$range", minValue: { $min: "$x" }, maxValue: { $max: "$x" }, Count: { $sum: 1 } } }, { $addFields: { x: [ { $toString: "$minValue" }, { $toString: "$maxValue" } ] } }, { $project: { range: "$_id", "_id": 0, x: 1, Count: 1 } }, { $sort: { range: 1 } } ])

patio de recreo

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

0

Aquí hay otra forma de consultar: produce un resultado con formato [ { min: 1 , max: 3 , count: 3 }, ... ] :

 db.collection.aggregate([ { $sort: { x: 1 } }, { $group: { _id: null, docs: { $push: "$x" }, firstVal: { $first: "$x" }, lastVal: { $last: "$x" } } }, { $project: { _id: 0, output: { $let: { vars: { result: { $reduce: { input: "$docs", initialValue: { prev: { $add: [ "$firstVal", -1 ] }, val: { min: "$firstVal", max: 0, count: 0 }, vals: [ ] }, in: { $cond: [ { $eq: [ { $subtract: [ "$$this", "$$value.prev" ] }, 1 ] }, { prev: "$$this", val: { min : "$$value.val.min", max: "$$value.val.max", count: { $add: [ "$$value.val.count", 1 ] } }, vals: "$$value.vals" }, { vals: { $concatArrays: [ "$$value.vals", [ { min : "$$value.val.min", max: "$$value.prev", count: "$$value.val.count" } ] ] }, val: { min: "$$this", max: "$lastVal", count: 1 }, prev: "$$this" }, ] } } } }, in: { $concatArrays: [ "$$result.vals", [ "$$result.val" ] ] } } } } }, ])
over 4 years ago · Santiago Trujillo Denunciar

0

Use $setWindowFields en lugar de $group todos los datos

 db.collection.aggregate([ { $setWindowFields: { partitionBy: "", sortBy: { x: 1 }, output: { c: { $push: "$x", window: { range: [ -3, 0 ] } } } } }, { $set: { "c": { "$cond": { "if": { "$gt": [ { "$size": "$c" }, 1 ] }, "then": 0, "else": 1 } } } }, { $setWindowFields: { partitionBy: "", sortBy: { x: 1 }, output: { g: { $sum: "$c", window: { documents: [ "unbounded", "current" ] } } } } }, { $group: { _id: "$g", count: { $sum: 1 }, max: { "$max": "$x" }, min: { "$min": "$x" } } } ])

parque infantil mongo


En PostgresSQL

 CREATE TABLE test ( id INT, x INT ); INSERT INTO test VALUES (1, 1); INSERT INTO test VALUES (2, 3); INSERT INTO test VALUES (3, 5); INSERT INTO test VALUES (4, 20); INSERT INTO test VALUES (5, 22);
 SELECT MAX(x) AS max, MIN(x) AS min, COUNT(*) AS count FROM ( SELECT *, SUM(inc) OVER(ORDER BY x) AS grp FROM ( SELECT *, CASE WHEN x - LAG(x) OVER(ORDER BY x) < 4 THEN NULL ELSE 1 END AS inc FROM test ) q ) q GROUP BY grp

db-violín

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