首页 > 解决方案 > 如何在聚合中使用 distinct

问题描述

我在汇总数据时遇到问题。我有一个这样的 NOSQL mongodb:

db.m_menu_access.aggregate([
            { $lookup: { from: "m_role", localField: "m_role_id", foreignField: "_id", as: "role" }}, 
            { $lookup: { from: "m_menu", localField: "m_menu_id", foreignField: "_id", as: "menu" }}, 
            { $unwind: "$role" },
            { $unwind: "$menu" }, 
            { $project: {
                    "_id": 1,
                    "code": 1,
                    "is_delete" : 1,
                    "m_role_id": 1,
                    "createDate" : 1,
                    "createBy" : 1,
                    "role.code": 1,
                    "role.name": 1,
                    "role.description": 1,
                    "m_menu_id" : 1,
                    "menu.code" : 1,
                    "menu.name" :1, 
                    "menu.controller"  : 1
                }
            }
        ])

然后,NOSQL 的结果如下所示:

{ 
    "_id" : ObjectId("5b7101bf2df1bb210c4b3a45"), 
    "m_role_id" : ObjectId("5b6baba57b69b3d4e3aedfe9"), 
    "m_menu_id" : ObjectId("5b6bac237b69b3d4e3aedfeb"), 
    "role" : {
        "code" : "RO0001", 
        "name" : "Administrator", 
        "description" : "Admin Mar-Kom"
    }, 
    "menu" : {
        "code" : "ME0001", 
        "name" : "Master Menu", 
        "controller" : "menu_controller"
    }
}
{ 
    "_id" : ObjectId("5b7101bf2df1bb210c4b3a46"), 
    "m_role_id" : ObjectId("5b6baba57b69b3d4e3aedfe9"), 
    "m_menu_id" : ObjectId("5b6bac477b69b3d4e3aedfec"), 
    "role" : {
        "code" : "RO0001", 
        "name" : "Administrator", 
        "description" : "Admin Mar-Kom"
    }, 
    "menu" : {
        "code" : "ME0002", 
        "name" : "Master User", 
        "controller" : "user_controller"
    }
}
{ 
    "_id" : ObjectId("5b7101bf2df1bb210c4b3a47"), 
    "m_role_id" : ObjectId("5b6baba57b69b3d4e3aedfe9"), 
    "m_menu_id" : ObjectId("5b6bac607b69b3d4e3aedfed"), 
    "role" : {
        "code" : "RO0001", 
        "name" : "Administrator", 
        "description" : "Admin Mar-Kom"
    }, 
    "menu" : {
        "code" : "ME0003", 
        "name" : "Master Company", 
        "controller" : "company_controller"
    }
}

我希望 NOSQL 结果是这样的:

{       
        "_id" : ObjectId("5b6baba57b69b3d4e3aedfe9"), 
        "code" : "RO0001", 
        "name" : "Administrator", 
        "description" : "Admin Mar-Kom"

        "menu" : 
        [
        {
            "m_menu_id" : ObjectId("5b6bac237b69b3d4e3aedfeb"),
            "code" : "ME0001", 
            "name" : "Master Menu", 
            "controller" : "menu_controller"
        },
        {
            "m_menu_id" : ObjectId("5b6bac477b69b3d4e3aedfec"), 
            "code" : "ME0002", 
            "name" : "Master User", 
            "controller" : "user_controller"
        },
        {
            "m_menu_id" : ObjectId("5b6bac607b69b3d4e3aedfed"), 
            "code" : "ME0003", 
            "name" : "Master Company", 
            "controller" : "company_controller"
        }
        ]
    }

所以“_id”:ObjectId(“5b6baba57b69b3d4e3aedfe9”),“code”:“RO0001”,“name”:“Administrator”,“description”:“Admin Mar-Kom”来自集合“m_role”

有人可以帮我解决这个问题吗?谢谢你

标签: mongodb

解决方案


将这些阶段添加到您的查询中:

{
   $addFields:{
      "menu.m_menu_id":"$m_menu_id"
   }
},
{
   $group:{
      _id:"$m_role_id",
      code:{
         $first:"$role.code"
      },
      name:{
         $first:"$role.name"
      },
      description:{
         $first:"$role.description"
      },
      menu:{
         $push:"$menu"
      }
   }
}

输出:

/* 1 */
{
    "_id" : ObjectId("5b6baba57b69b3d4e3aedfe9"),
    "code" : "RO0001",
    "name" : "Administrator",
    "description" : "Admin Mar-Kom",
    "menu" : [ 
        {
            "code" : "ME0001",
            "name" : "Master Menu",
            "controller" : "menu_controller",
            "m_menu_id" : ObjectId("5b6bac237b69b3d4e3aedfeb")
        }, 
        {
            "code" : "ME0002",
            "name" : "Master User",
            "controller" : "user_controller",
            "m_menu_id" : ObjectId("5b6bac477b69b3d4e3aedfec")
        }, 
        {
            "code" : "ME0003",
            "name" : "Master Company",
            "controller" : "company_controller",
            "m_menu_id" : ObjectId("5b6bac607b69b3d4e3aedfed")
        }
    ]
}

推荐阅读