How can I find many set intersections between documents in one collection in MongoDB?

A collection named "coll" is stored in the mongodb collection.

{
    {"_id":1, "set":[1,2,3,4,5]},
    {"_id":2, "set":[0,2,6,4,5]},
    {"_id":3, "set":[1,2,5,10,22]}
}

      

How do I find the intersection of given items in the above collection documents using _id 1 and 3.

+3


source to share


1 answer


Use an aggregation framework to get the desired result. Aggregation set operator that would do the magic . $setIntersection

The following aggregation pipeline achieves what you need:

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 
        }
    }
])

      

Output

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

      




UPDATE

For three or more documents that need to be traversed, you will need an operator to flatten the arrays. This will allow you to traverse any number of arrays, so instead of just traversing two arrays from documents 1 and 3, this applies to multiple arrays as well. $reduce

Consider the following aggregation operation:

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"] }
                }
            }
        }
    }
])

      

+3


source







All Articles