首页 > 解决方案 > 获取具有关注者和关注者的相互列表

问题描述

我有一些模式名称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
}

标签: node.jsmongodb

解决方案


您可以使用以下管道:

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

推荐阅读