使用 $lookup 运算符获取总提交数和 "AC" 的提交数

Get the count of total submissions and the number of submissions with "AC" using $lookup operator

我有以下 MongoDB collection:

db={
  "problems": [
    {
      "problemId": 1,
      "title": "dummy 1",
    },
    {
      "problemId": 2,
      "title": "dummy 2",
    }
  ],
  "submissions": [
    {
      "submissionId": 1,
      "status": "AC",
      "problemId": 1,
    },
    {
      "submissionId": 2,
      "status": "AC",
      "problemId": 1,
    },
    {
      "submissionId": 3,
      "status": "WA",
      "problemId": 2,
    },
    {
      "submissionId": 4,
      "status": "WA",
      "problemId": 1,
    },
    {
      "_id": 5,
      "status": "AC",
      "problemId": 2,
    },
    {
      "_id": 6,
      "status": "WA",
      "problemId": 2,
    }
  ]
}

我想显示提交总数和状态为 'AC' 的解决方案数量。我希望结果如下所示:

[
  {
    "problemId": 1,
    "title": "dummy 1",
    "total_submissions": 3,
    "accepted_submissions": 2
  },
]

到目前为止,我已经使用 $lookup 运算符并做了如下操作:

db.problems.aggregate([
  {
    "$lookup": {
      "from": "submissions",
      "localField": "problemId",
      "foreignField": "problemId",
      "as": "submission_docs"
    }
  }
])

但我得到的结果是:(我只显示了列表中的一项)

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "problemId": 1,
    "submission_docs": [
      {
        "_id": ObjectId("5a934e000102030405000003"),
        "problemId": 1,
        "status": "AC",
        "submissionId": 1
      },
      {
        "_id": ObjectId("5a934e000102030405000004"),
        "problemId": 1,
        "status": "AC",
        "submissionId": 2
      },
      {
        "_id": ObjectId("5a934e000102030405000006"),
        "problemId": 1,
        "status": "WA",
        "submissionId": 4
      }
    ],
    "title": "dummy 1"
  }
]

MongoDB 游乐场可在此处找到:https://mongoplayground.net/p/YRdpyQN5f00

  1. 使用$size计算submission_docs数组长度total_submissions
  2. 通过$filter过滤submission_docs中状态为“AC”的提交,然后计算数组长度。
db.problems.aggregate([
  {
    "$lookup": {
      "from": "submissions",
      "localField": "problemId",
      "foreignField": "problemId",
      "as": "submission_docs"
    }
  },
  {
    $project: {
      _id: 0,
      problemId: 1,
      title: 1,
      total_submissions: {
        $size: "$submission_docs"
      },
      accepted_submissions: {
        $size: {
          $filter: {
            input: "$submission_docs",
            cond: {
              $eq: [
                "$$this.status",
                "AC"
              ]
            }
          }
        }
      }
    }
  }
])

Sample Mongo Playground