首页 > 解决方案 > 我如何获得已完成多少次考试

问题描述

我有 3 个集合:类别、考试和结果。

对于每个类别,我都有一些考试。如果完成了一项考试,我会将其结果添加到“结果”集合中。

我参加了每个类别的所有考试。问题是我无法计算其中完成了多少。

这就是我现在得到的:

{ category: "Test", total_exams: 10 }

这就是我要的:

{ category: "Test", total_exams: 10, done_exam: 4 }

您可以在下面看到我到目前为止所做的事情:

https://mongoplayground.net/p/upSAPkYe4DR

标签: node.jsmongodbaggregation-framework

解决方案


快速修复:

  • 第二$lookup阶段,让过去examsCount._id
  • 在管道$match阶段匹配表达式内部,$exam_id with $$examId
  • user_id匹配条件放在表达式之外
  • $count文件总数count
  • $addFields to getdoneExams.count this will return count in zero index, get it using$first or$arrayElemAt`
db.categories.aggregate([
  {
    $lookup: {
      from: "exams",
      localField: "_id",
      foreignField: "categoryId",
      as: "examsCount"
    }
  },
  {
    $lookup: {
      from: "results",
      let: { examId: "$examsCount._id" },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [{ $in: ["$exam_id", "$$examId"] }]
            },
            user_id: 22222222
          }
        },
        { $count: "count" }
      ],
      as: "doneExams"
    }
  },
  {
    $addFields: {
      examsCount: { $size: "$examsCount" },
      doneExams: { $first: "$doneExams.count" }
    }
  }
])

操场

有很多方法可以得到这个结果,我刚刚在你的方法中解决了你的问题。


推荐阅读