You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mongoose中group by结合lookup关联查询并统计嵌套答案响应数如何实现

你的现有查询缺少了每个answerId对应的响应次数统计,且没有把统计数据和Quiz集合里的答案元数据做合并,按以下方案调整即可:

调整后的完整聚合查询

db.quizResults.aggregate([
  // 1. 过滤指定vidId的答题记录
  { "$match": { "vidId": 8225342 } },
  // 2. 按【问题ID+答案ID】分组,统计每个答案的响应次数
  {
    "$group": {
      "_id": {
        questionId: "$questionId",
        answerId: "$answerId"
      },
      "count": { "$sum": 1 },
      "isCorrect": { "$first": "$isCorrect" }
    }
  },
  // 3. 再按问题ID分组,汇总整道题的统计数据,同时收集所有答案的统计结果
  {
    "$group": {
      "_id": "$_id.questionId",
      "correct": {
        "$sum": {
          "$cond": [{ "$eq": ["$isCorrect", true] }, "$count", 0]
        }
      },
      "incorrect": {
        "$sum": {
          "$cond": [{ "$eq": ["$isCorrect", false] }, "$count", 0]
        }
      },
      "totalAnswers": { "$sum": "$count" },
      "answerStats": {
        "$push": {
          "answerId": "$_id.answerId",
          "numResponses": "$count"
        }
      }
    }
  },
  // 4. 关联Quiz集合取问题和答案的元数据
  {
    "$lookup": {
      "from": "quiz",
      "let": { "questionId": "$_id" },
      "pipeline": [
        { "$match": { "$expr": { "$in": ["$$questionId", "$questions._id"] } } },
        { "$unwind": "$questions" },
        { "$match": { "$expr": { "$eq": ["$questions._id", "$$questionId"] } } },
        {
          "$project": {
            "questionNum": "$questions.questionNum",
            "questionName": "$questions.questionName",
            "answers": "$questions.answers",
            "_id": 0
          }
        }
      ],
      "as": "quizData"
    }
  },
  { "$unwind": "$quizData" },
  // 5. 合并答案元数据和统计数据,生成最终的answers数组
  {
    "$project": {
      "_id": 0,
      "questionNum": "$quizData.questionNum",
      "questionName": "$quizData.questionName",
      "correct": 1,
      "incorrect": 1,
      "totalAnswers": 1,
      "answers": {
        "$map": {
          "input": "$quizData.answers",
          "as": "ans",
          "in": {
            "answerId": "$$ans.answerId",
            "answerName": "$$ans.answerName",
            "numResponses": {
              "$let": {
                "vars": {
                  "matchedStat": {
                    "$first": {
                      "$filter": {
                        "input": "$answerStats",
                        "cond": { "$eq": ["$$this.answerId", "$$ans.answerId"] }
                      }
                    }
                  }
                },
                "in": { "$ifNull": ["$$matchedStat.numResponses", 0] }
              }
            }
          }
        }
      }
    }
  }
])

核心改动说明

  1. 新增两层分组逻辑:先按questionId+answerId分组统计每个答案的响应次数,再按questionId分组汇总整道题的对错总数、总答题数,同时把所有答案的统计结果存储为数组
  2. 最后$project阶段通过$map+$filter组合,把Quiz集合里的原始答案和统计到的响应次数做关联,就算没有用户选择的答案也会自动赋值numResponses: 0,完全匹配你需要的输出格式

内容的提问来源于stack exchange,提问作者Bilal Maher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 23:24:02