Reputation: 37
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
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