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

225
Vistas
¿Cómo agregar 2 listas si al menos un elemento coincide?

Por ejemplo, tengo 6 artículos en la colección.

 { _id: 1, list: ["A", "B"] } { _id: 2, list: ["C", "A"] } { _id: 3, list: ["E", "F"] } { _id: 4, list: ["E", "D"] } { _id: 5, list: ["U", "I"] } { _id: 6, list: ["D", "K"] }

Haría una consulta para fusionar todos los elementos que su lista tiene al menos 1 coincidencia de elemento. Entonces el resultado será:

 { _id: 7, list: ["A", "B", "C"] } { _id: 8, list: ["E", "F", "D", "K"] }

Soy nuevo en MongoDB, ¿alguien me ayuda con esta consulta? Muchas gracias.

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

0

Encontré esta solución que casi resuelve tu problema.

 db.lists.aggregate([ {$unwind:"$list"}, {$group:{_id:"$list", merged:{$addToSet:"$_id"}, size:{$sum:1}}}, {$match:{size: {$gt: 1}}}, {$project:{_id: 1, merged:1, size: 1, merged1: "$merged"}}, {$unwind:"$merged"}, {$unwind:"$merged1"}, {$group:{_id:"$merged", letter:{$first:"$_id"}, size:{$sum: 1}, set: {$addToSet:"$merged1"}}}, {$sort:{size:1}}, {$group:{_id: "$letter", mergedIds:{$last:"$set"}, size:{$sum:1}}}, {$match: {size:{$gt:1}}} ])

He probado esto en mi shell mongo que da el siguiente resultado:

 { "_id" : "E", "matchedIds" : [ 6, 3, 4 ], "size" : 2 } { "_id" : "A", "matchedIds" : [ 1, 2 ], "size" : 2 }

matchedIds representa los documentos id -s que tienen un valor común en la matriz de la list .

Creo que en la agregación anterior se puede hacer alguna optimización, pero inicialmente encontré esto, intentaré encontrar otras formas. Además, puede usar la agregación $lookup al final de la tubería de agregación para hacer coincidir los id -s con los valores set . No pude probar esto porque mi versión de mongo no es compatible $lookup . Pero puede obtener manualmente esos valores dentro de algunos bucles for si usa Node.js u otra cosa.

editado

Este algoritmo solo funcionará si la cantidad de listas intersecadas para cada lista no es más de 3.

Por ejemplo, esto funcionará:

 { "_id" : 1, "list" : [ "A", "B" ] } { "_id" : 2, "list" : [ "C", "A" ] } { "_id" : 3, "list" : [ "E", "F" ] } { "_id" : 4, "list" : [ "E", "D" ] } { "_id" : 5, "list" : [ "U", "I" ] } { "_id" : 6, "list" : [ "D", "K" ] } { "_id" : 7, "list" : [ "A", "L" ] }

pero esto no:

 { "_id" : 1, "list" : [ "A", "B" ] } { "_id" : 2, "list" : [ "C", "A" ] } { "_id" : 3, "list" : [ "E", "F" ] } { "_id" : 4, "list" : [ "E", "D" ] } { "_id" : 5, "list" : [ "U", "I" ] } { "_id" : 6, "list" : [ "D", "K" ] } { "_id" : 7, "list" : [ "L", "K" ] }

Aquí las listas con ID de 7, 6, 4, 3 tienen intersección, por lo que el número de listas intersectadas es 4, en este caso el algoritmo provisto no funcionará. Funcionará solo si la cantidad de intersección es inferior a 4 para cada lista

Noticia final

Parece que no puede lograr el resultado deseado haciendo un cálculo de combinación en la capa de la base de datos mongo. Si está creando una aplicación, será mejor hacer cálculos también en la capa de la aplicació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