如何将用户列表结果与另一个集合中数组的值合并和分组?

时间:2019-04-01 04:47:54

标签: arrays mongodb

我是MongoDB的新手,正在尝试检索包含其用户角色的用户列表,这些用户角色作为用户集合的单独集合存储在数据库中。

我有一个用户集合,下面是示例文档:

/* 1 */
{
 "_id": "cf67e695-ea52-47a8-8e42-b95b863a2b69",
 "DateCreated": ISODate("2018-11-11T21:41:37.125Z"),
 "Email": "user@email.com",
 "FirstName": "John",
 "LastName": "Does",
 "Language": "en",
 "TimeZoneId": null,
 "Roles": [
   "c2ee344f-48b7-4c46-9392-853c6debd631",
   "ada94631-af8c-43e9-a031-de62ffae1d20"
 ],
 "Status": 0
}

我还有一个Roles集合,下面的示例文档:

{
 "_id": "c2ee344f-48b7-4c46-9392-853c6debd631",
 "DateCreated": ISODate("2018-11-14T10:58:27.053Z"),
 "Name": "Administrator 2",
 "Description": " View only but able to manage their own users (credentials). They do have update capabilities"
}

我想要的是检索一个列表,该列表显示角色的用户友好名称,而不是当前针对“用户配置文件”存储的每个角色的_id值。我离那里很近。

使用以下内容,我可以获取“角色”列表的结果,但只能获取角色名称。我想要的是完整的用户个人资料,以及每个文档附带的用户友好名称。到目前为止,这是我的语法:

db.Users.aggregate([
 {
   $match: {
     "Email": /@email.com/
   }
 },
 {
   $project: {
     _id: 1,
     Email: 1,
     FirstName: 1,
     Roles: 1
   }
 },
 {
   $unwind: {
     path: "$Roles"
   }
 },
 {
   $lookup: {
     from: "Roles",
     localField: "Roles",
     foreignField: "_id",
     as: "Roles"
   }
 },
 {
   $group: {
     _id: "$_id",
     Roles: {
       $push: "$Roles.Name"
     }
   }
 }
])

无论出于何种原因,我都没有在结果中返回“电子邮件”,“名字”和“姓氏”字段。我目前得到的是:

{
 "_id": "639ba2b6-fc80-44f4-8ac0-0a92d61099c4",
 "Roles": [
   [
     "Administrator 2"
   ],
   [
     "Administrators"
   ]
 ]
}

我想得到类似的东西:

{
 "_id": "cf67e695-ea52-47a8-8e42-b95b863a2b69",
 "DateCreated": ISODate("2018-11-11T21:41:37.125Z"),
 "Email": "user@email.com",
 "FirstName": "John",
 "LastName": "Does",
 "Language": "en",
 "TimeZoneId": null,
 "Roles": [
   "Administrators",
   "Administrator 2"
 ],
 "Status": 0
}

任何帮助,非常感谢!

2 个答案:

答案 0 :(得分:0)

  

添加此代码

db.users.aggregate([
   {
      $unwind: "$Roles"
   },
   {
      $lookup:
         {
            from: "roles",
            localField: "_id",
            foreignField: "Roles",
            as: "Roles"
        }
   }
]).exec((err, result) => {
    console.log(result);
})

答案 1 :(得分:0)

您必须在$group管道中包括这些字段,请使用以下内容更新您的$group

$group: {
 _id: "$_id",
 FirstName: {$first:"$FirstName"},
 Email: {$first:"Email"},
 Roles: {
   $push: "$Roles.Name"
 }

}

您可以使用$first中的$group添加更多所需的字段。我已经尝试使用给定的示例文档及其对我有用。