为什么$lookup中的$regex通过$addFields结果在mongodb聚合中不起作用?

nzkunb0c  于 2023-10-16  发布在  Go
关注(0)|答案(1)|浏览(116)

我有groupsstudents集合。

Groups: {_id : ObjectId, title: String}
Students{mainGroups: String}

mainGroups是一个连接的字符串,对于所有的groups,每个学生都在学校学习过。
我的代码是给我的,所有groups的所有students集合。
我想将groups集合与students聚合,并将students集合作为单个数组获取,对于每个groups,无论返回多少个students

[
  //mainGroups is String that`s why I convert Group`s $_id to String here
  {$addFields: {
    gid: {$toString:"$_id"}  
  }},
  {$project: {
     _id: 1,
     gid: 1,
     title:1
  }},
  { 
   $lookup: {
    "from": 'students',
    "let": {"groupId": "$gid"},
    pipeline: [
      {"$match": 
        {"$expr" :  
          {"mainGroups":{"$regex": "$$groupId", "$options" :"i"}}
        }
      }
    ],
    as: "student"
   }
  },
]

我怎样才能得到groupsstudents的数量?

kxeu7u2r

kxeu7u2r1#

修改代码如下:

[
    {
        $addFields: {
            gid: { $toString: "$_id" }
        }
    },
    {
        $lookup: {
            from: 'students',
            let: { groupId: "$gid" },
            pipeline: [
                {
                    $match: {
                        $expr: {
                            $regexMatch: {
                                input: "$mainGroups",
                                regex: { $concat: [".*", "$$groupId", ".*"] },
                                options: "i"
                            }
                        }
                    }
                }
            ],
            as: "students"
        }
    },
    {
        $project: {
            _id: 1,
            gid: 1,
            title: 1,
            studentCount: { $size: "$students" }
        }
    }
]

让我解释一下我们所做的改变以及原因:

  • $lookup阶段,我们没有在$match表达式中使用$regex运算符,而是选择了$regexMatch运算符。这个变化允许我们在字符串中搜索特定的模式。
  • 为了动态地构造正则表达式模式,我们现在使用基于$$groupId变量的$concat。
  • $project阶段,我们使用$size运算符来确定students数组中的学生数量,该数组是在$lookup阶段填充的。

因此,最终输出中的每个组文档都将包括一个名为studentCount的新字段,该字段表示与该组关联的学生总数,由mainGroups字段确定。

相关问题