在 mongoDB 中连接两个集合,并在 node js 中提取数据



我正在为我的项目使用MongoDB 3.6。我有 2 个集合"用户"和"关注"。我想提取用户的关注者和关注者的详细信息(如Instagram应用程序(。

用户集合

{
    "id" : "1",
    "name" : "abc",
    "age" : "26"
},
{
    "id" : "2",
    "name" : "xyz",
    "age" : "22"
},
{
    "id" : "3",
    "name" : "qwe",
    "age" : "23"
}

关注收藏

{
    "id" : "2",
    "follow id" : "1"
},
{
    "id" : "3",
    "follow id" : "1"
},
{
    "id" : "1",
    "follow id" : "2"
},
{
    "id" : "2",
    "follow id" : "3"
},
{
    "id" : "1",
    "follow id" : "3"
}

现在我想要以下 id 2 列表,所以 id 2 在 id 1 和 id 3 之后所以,输出应该是这样的

{
    "id" : "1",
    "name" : "abc",
    "age" : "26"
},
{
    "id" : "3",
    "name" : "qwe",
    "age" : "23"
}

为此,我正在使用$lookup聚合。但这并没有给出我想要的所需输出。这是我的代码 -

Follow.aggregate([
    { 
        $lookup:{
            from:"users",
            localField:"id",
            foreignField:"id",
            as:"fromItems"
        }
    },
    {
        $replaceRoot:{newRoot: {$mergeObjects: [ { $arrayElemAt: ["$fromItems", 0 ] }, "$$ROOT" ] } }
    },
    { $project : 
        { 
            fromItems : 0 
        } 
    }
], callback)

如需更多了解,请参阅图片

要获取以下 id 2列表,您可以使用以下查询:

Follow.aggregate([
    {
        $match: { "id": "2" }
    },
    { 
        $lookup:{
            from:"users",
            localField:"follow id",
            foreignField:"id",
            as:"fromItems"
        }
    },
    {
        $replaceRoot:{newRoot: {$mergeObjects: [ { $arrayElemAt: ["$fromItems", 0 ] }, "$$ROOT" ] } }
    },
    { $project : 
        { 
            id : "$follow id",
            name: 1,
            age: 1 
        } 
    }
])

所以这里的重点是你在idfollow id之间有一个关系,在$lookup阶段之后follow id成为新的id,因为它是父子关系。

编辑:3.4 以下解决方案

Follow.aggregate([
    {
        $match: { "id": "2" }
    },
    { 
        $lookup:{
            from:"users",
            localField:"follow id",
            foreignField:"id",
            as:"fromItems"
        }
    },
    {
        $project: {
            id: "$follow id",
            from: { $arrayElemAt: ["$fromItems", 0 ] }
        }
    },
    { $project : 
        { 
            id : 1,
            name: "$from.name",
            age: "$from.age" 
        } 
    }
])

相关内容

  • 没有找到相关文章

最新更新