sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo encontrar la intersección de conjuntos de conjuntos entre los documentos en una sola colección en MongoDB?

Utilice el marco de agregación para obtener el resultado deseado. El operador conjunto de agregación eso haría la magia es $setIntersection .

La siguiente canalización de agregación logra lo que busca:

db.test.aggregate([
    {
        "$match": {
            "_id": { "$in": [1, 3] }
        }
    },
    {
        "$group": {
            "_id": 0,
            "set1": { "$first": "$set" },
            "set2": { "$last": "$set" }
        }
    },
    {
        "$project": { 
            "set1": 1, 
            "set2": 1, 
            "commonToBoth": { "$setIntersection": [ "$set1", "$set2" ] }, 
            "_id": 0 
        }
    }
])

Salida :

/* 0 */
{
    "result" : [ 
        {
            "set1" : [1,2,3,4,5],
            "set2" : [1,2,5,10,22],
            "commonToBoth" : [1,2,5]
        }
    ],
    "ok" : 1
}

ACTUALIZAR

Para que se crucen tres o más documentos, necesitaría $reduce operador para aplanar las matrices. Esto le permitirá intersectar cualquier cantidad de arreglos, por lo que en lugar de simplemente hacer una intersección de los dos arreglos de los documentos 1 y 3, esto también se aplicará a varios arreglos.

Considere ejecutar la siguiente operación agregada:

db.test.aggregate([
    { "$match": { "_id": { "$in": [1, 3] } } },
    {
        "$group": {
            "_id": 0,
            "sets": { "$push": "$set" },
            "initialSet": { "$first": "$set" }
        }
    },
    {
        "$project": {
            "commonSets": {
                "$reduce": {
                    "input": "$sets",
                    "initialValue": "$initialSet",
                    "in": { "$setIntersection": ["$$value", "$$this"] }
                }
            }
        }
    }
])