获取具有关注者和关注者的共同列表

时间:2020-01-22 12:20:41

标签: node.js mongodb

我有一个架构名称follower,其中user字段包含要遵循的值,follower是紧随user之后的那个。我想要一个正在关注并且同时也被同一个人关注的用户列表。下面是集合follower。我需要像"user" : ObjectId("5e09e4ab35f4a75e8d8536a9"), "follower" : ObjectId("5e15a8763a8ec3019f6f9652"),"user" : ObjectId("5e15a8763a8ec3019f6f9652"), "follower" : ObjectId("5e09e4ab35f4a75e8d8536a9"),这样的条目,因为它们彼此都在跟踪。

/* 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
}

1 个答案:

答案 0 :(得分:1)

您可以使用以下管道:

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