我是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
}
任何帮助,非常感谢!
答案 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
添加更多所需的字段。我已经尝试使用给定的示例文档及其对我有用。