猫鼬聚合:在“组”阶段内查询

问题描述

我有以下问题:

我有以下两种型号:

Assignment: {
  _id,isPublic: Boolean
}

Solution: {
  _id,totalTime: Number,assignment: { type: Schema.Types.ObjectId,ref: 'Assignment' },}

我想查询所有解决方案,按分配对它们进行分组,但是我只关心公开的分配(isPublic === true)。

但是我不知道在哪里进行查询。你能帮我吗?

到目前为止,我的汇总如下:

{
        $match: {
            assignment: {
                $exists: true,$ne: null,},{
            $group: {
                _id: '$assignment',totalTime: { $sum: '$totalTime' },{
            $sort: {
                totalTime: -1,}
}

这很好,但是如何过滤结果以仅考虑公共作业?我发现所有筛选器和查询方法似乎只能在find()中使用,而不能用于聚合。

您有什么建议吗?

解决方法

您可以将$lookup与管道一起使用

  • $lookup加入Assignment集合
  • $match分配ID,且为true。
  • $match外部查找,检查分配不为空[],
  { $match: ...  },// skipping 

  // add this
  {
    $lookup: {
      from: "Assignment",let: { aId: "$assignment" },pipeline: [
        {
          $match: {
            $expr: { $eq: ["$_id","$$aId"] },isPublic: true
          }
        }
      ],as: "assignments"
    }
  },// add this
  { $match: { assignments: { $ne: [] } } },{ $group: ... },// skipping
  { $sort: ... } // skipping

Playground

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...