Pawan Kumar
Pawan Kumar

Reputation: 37

Get mutual list having both following and follower

I've some schema name follower where user field contains valued which is being followed and follower is one who is following above user. I want the list of users who are following and at the same time also being followed by the same person.Below is the collection follower. I need those entries like "user" : ObjectId("5e09e4ab35f4a75e8d8536a9"), "follower" : ObjectId("5e15a8763a8ec3019f6f9652"), and "user" : ObjectId("5e15a8763a8ec3019f6f9652"), "follower" : ObjectId("5e09e4ab35f4a75e8d8536a9"), as they both are following each other.

/* 1 */
{
    "_id" : ObjectId("5e15c0c03a8ec3019f6f96c4"),
    "createdAt" : "1578395182056",
    "user" : ObjectId("5e09e4ab35f4a75e8d8536a9"),
    "follower" : ObjectId("5e15a8763a8ec3019f6f9652"),
    "__v" : 0
}

/* 2 */
{
    "_id" : ObjectId("5e1700852ad51f163b434d23"),
    "createdAt" : "1578495739228",
    "user" : ObjectId("5e15a8763a8ec3019f6f9652"),
    "follower" : ObjectId("5e16f8892ad51f163b434ca6"),
    "__v" : 0
}

/* 3 */
{
    "_id" : ObjectId("5e1c82222ad51f163b434db1"),
    "createdAt" : "1578495739228",
    "user" : ObjectId("5e09e4ab35f4a75e8d8536a9"),
    "follower" : ObjectId("5e1c780c2ad51f163b434dae"),
    "__v" : 0
}

/* 4 */
{
    "_id" : ObjectId("5e21da4004925e327f6971f6"),
    "createdAt" : "1579257833519",
    "user" : ObjectId("5e09e4ab35f4a75e8d8536a9"),
    "follower" : ObjectId("5e21967f04925e327f6971a0"),
    "__v" : 0
}

/* 5 */
{
    "_id" : ObjectId("5e22b8ddc30a562d3b3238e8"),
    "createdAt" : "1579328869333",
    "user" : ObjectId("5e21967f04925e327f6971a0"),
    "follower" : ObjectId("5e09e4ab35f4a75e8d8536a9"),
    "__v" : 0
}

/* 6 */
{
    "_id" : ObjectId("5e22babfc30a562d3b3238ec"),
    "createdAt" : "1579328869333",
    "user" : ObjectId("5e09fbd035f4a75e8d8536c1"),
    "follower" : ObjectId("5e09e4ab35f4a75e8d8536a9"),
    "__v" : 0
}

/* 7 */
{
    "_id" : ObjectId("5e26b580630be3588b5ed152"),
    "createdAt" : "1579594730310",
    "user" : ObjectId("5e09e76035f4a75e8d8536ae"),
    "follower" : ObjectId("5e09e4ab35f4a75e8d8536a9"),
    "__v" : 0
}

/* 8 */
{
    "_id" : ObjectId("5e27101527bb4366a8ee5d54"),
    "createdAt" : "1579614413346",
    "user" : ObjectId("5e09e7d335f4a75e8d8536af"),
    "follower" : ObjectId("5e09e4ab35f4a75e8d8536a9"),
    "__v" : 0
}

Upvotes: 1

Views: 47

Answers (1)

Tom Slabbaert
Tom Slabbaert

Reputation: 22296

You can use this following pipeline:

db.collection.aggregate(
    [
        {
            "$lookup": {
                "from": "followers", //this is the current collection, I didn't know what's the name
                "let": {
                    "currUser": "$user",
                    "currFollower": "$follower"
                },
                "pipeline": [
                    {
                        "$match": {
                            "$expr": {
                                "$and": [
                                    {
                                        "$eq": [
                                            "$user",
                                            "$$currFollower"
                                        ]
                                    },
                                    {
                                        "$eq": [
                                            "$follower",
                                            "$$currUser"
                                        ]
                                    }
                                ]
                            }
                        }
                    }
                ],
                "as": "matched"
            }
        },
        {
            "$match": {
                "matched.0": {
                    "$exists": true
                }
            }
        },
        {
            "$group": {
                "_id": null,
                "usersThatFollowEachOther": {"$addToSet": "$follower"}
            }
        }
    ]
);

Upvotes: 1

Related Questions