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.
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.