如何解决Mongodb $lookup 聚合返回来自外部索引的所有文档
[{
username: "foo@bar,roleIds: [ Types.ObjectId("1234") ]
},{
username: "foo@moo,}]
带有 roles
{
"_id" : ObjectId("60465768f768621ec5828b68"),"name" : "admin","permissionIds" : ObjectId("604657e8e715ss1f2d78b945")
}
和permissions
{
"_id" : ObjectId("604657e8e715ss1f2d78b945"),"name" : "view-user",}
当我通过用户名获取用户时,我想对角色信息进行水合。 并非所有用户都有 roleIds,因此无论他们是否有 roleIds,我都需要能够返回用户。
目前对角色的查找总是返回 roles
索引中的每一项!
我的想法是通过数组 roles
到 roles
查找连接索引 roleIds
的 _ids
然后我在该查找中使用管道从角色中获取权限信息。
db.getCollection('users').aggregate([
{
$match: {
'username':'foo@bar',}
},{
$lookup: {
from: 'roles',let: {'roleIds': '_id'},as: 'roles',pipeline: [{
$lookup: {
from: 'permissions',let: {'permissionIds': "_id"},as: 'permissions',pipeline: [
{
$project: {
name: 1
}
}
]
}
},{
$project: {
name: 1,permissions: 1
}
}
]
}
}
])
这条路由似乎只是返回 roles
索引内的所有文档,而不管它是否实际上是一个连接。
是不是我马上做错了什么??
解决方法
您的查询中有以下错误:
- 您在两次查找中都将错误的变量传递给
pipeline
内的let
。 - 缺少执行实际连接操作的管道内的
$match
阶段。 - 使用
roleIds
使用[]
初始化空ifNull
(因为所有用户都没有该字段)。
试试这个查询:
db.getCollection('users').aggregate([
{
$match: {
'username': 'foo@bar',}
},{
$lookup: {
from: 'roles',let: { 'roleIds': { $ifNull: ["$roleIds",[]] } },as: 'roles',pipeline: [
{
$match: {
$expr: { $in: ["$_id","$$roleIds"] }
}
},{
$lookup: {
from: 'permissions',let: { 'permissionId': "$permissionIds" },pipeline: [
{
$match: {
$expr: { $eq: ["$_id","$$permissionId"] }
}
},{
$project: {
name: 1
}
}
],as: 'permissions'
}
},{
$project: {
name: 1,permissions: 1
}
}
]
}
}
]);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。