微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Mongodb $lookup 聚合返回来自外部索引的所有文档

如何解决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 索引中的每一项!

我的想法是通过数组 rolesroles 查找连接索引 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 索引内的所有文档,而不管它是否实际上是一个连接。

是不是我马上做错了什么??

解决方法

您的查询中有以下错误:

  1. 您在两次查找中都将错误的变量传递给 pipeline 内的 let
  2. 缺少执行实际连接操作的管道内的 $match 阶段。
  3. 使用 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 举报,一经查实,本站将立刻删除。