【问题标题】:MongoDB $lookup on nested document and prepare result as requiredMongoDB $查找嵌套文档并根据需要准备结果
【发布时间】:2018-12-29 11:40:33
【问题描述】:

我有两个集合,一个是权限,另一个是角色。现在我需要通过权限对象 ID 连接从这两个集合中检索数据,我的查询运行良好,但无法获得所需的结果。收藏详情如下。

权限:

{
"_id" : ObjectId("5b4998d4abb4369f8c1ad0d6"),
"roleName" : "Super top level",
"permissions" : [ 
    {
        "_id" : ObjectId("5b49982d34f95d80609ce99d"),
        "access" : [ 
            "view_graph", 
            "view_daily_trip", 
            "view_profit"
        ]
    }, 
    {
        "_id" : ObjectId("5b49982d34f95d80609ce99e"),
        "access" : [ 
            "view", 
            "add", 
            "edit", 
            "delete", 
            "special", 
            "disable"
        ]
    }, 
    {
        "_id" : ObjectId("5b49982d34f95d80609ce99f"),
        "access" : [ 
            "trip_view", 
            "trip_add", 
            "trip_edit", 
            "trip_delete", 
            "trip_special", 
            "trip_disable"
        ]
    }
]

}

角色:

{
"_id" : ObjectId("5b4998d4abb4369f8c1ad0d6"),
"roleName" : "Super top level",
"permissions" : [ 
    {
        "_id" : ObjectId("5b49982d34f95d80609ce99d"),
        "access" : [ 
            "view_graph",
            "view_daily_trip",
            "view_profit"
        ]
    }, 
    {
        "_id" : ObjectId("5b49982d34f95d80609ce99e"),
        "access" : [ 
            "view",
            "add",
            "edit",
            "delete"
        ]
    }, 
    {
        "_id" : ObjectId("5b49982d34f95d80609ce99f"),
        "access" : [ 
            "trip_view",
            "trip_add",
            "trip_edit"
        ]
    }
]

}

要求的结果:

[
{
    "_id": "5b4998d4abb4369f8c1ad0d6",
    "roleName": "Mid level",
    "permissions": [
        {
            "_id": "5b49982d34f95d80609ce99d",
            "access": [
                "view_graph",
                "view_daily_trip",
                "view_profit"
            ],
            "permissionGroups": "Dashboard",
            "allAccess": [
                "view_graph",
                "view_daily_trip",
                "view_profit"
            ]
        },
        {
            "_id": "5b49982d34f95d80609ce99e",
            "access": [
                "view",
                "add",
                "edit",
                "delete"
            ],
            "permissionGroups": "User",
            "allAccess": [
                "view",
                "add",
                "edit",
                "delete",
                "special",
                "disable"
            ]
        },
        {
            "_id": "5b49982d34f95d80609ce99f",
            "access": [
                "trip_view",
                "trip_add",
                "trip_edit"
            ],
            "permissionGroups": "Trip",
            "access": [
                "trip_view",
                "trip_add",
                "trip_edit",
                "trip_delete",
                "trip_special",
                "trip_disable"
            ]
        }
    ]
}

]

我已经尝试了很多使用$lookup, $unwind, $project$group 但没有给我这个结果。 你能帮我写出确切的查询吗?您的帮助将不胜感激。 谢谢:)

【问题讨论】:

  • 您的两个集合都具有相同的 JSON?哪一个是两者的共同键?
  • @Anthony Winzlet,实际上并非如此,这取决于角色,有些角色将包含所有访问字符串,有些角色将很少,并且两者都有一个共同的对象 ID。

标签: mongodb mongodb-query


【解决方案1】:
**Its worked for me !**

db.collection('roles').aggregate([
    { $unwind: "$permissions" },
    {
        $lookup:{
            from: "permissions",
            localField: "permissions._id",
            foreignField: "_id",
            as: "permissions.permissionObj"
        }
    },
    {
        $project:{
            "roleName":1,
            permissions: {
                "_id":'$permissions._id',
                "assignPermission":'$permissions.access',
                "groupName": {
                    $arrayElemAt: [ '$permissions.permissionObj.permissionGroups', 0 ]
                },
                "allPermission": {
                    $arrayElemAt: [ '$permissions.permissionObj.permissions', 0 ]
                }
            }
        }
    },
    {
        $group: {
            _id: "$_id",
            roleName: { $first: '$roleName' },
            permissions: { $push:  "$permissions" }
        }
    },
    { $sort:{ _id:1 }}
]);

【讨论】:

猜你喜欢
  • 2016-07-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 2018-02-18
  • 2018-03-09
  • 2020-11-29
  • 2021-08-06
  • 2021-02-25
相关资源
最近更新 更多