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

Mongoose中如何基于关联引用表统计符合条件的Task文档数量

实现方案

以下提供两种常用的实现方式,可根据你的实际数据量级选择:

方案1:聚合管道查询(推荐)

直接在数据库层面完成全链路筛选统计,性能最优,适合大数据量场景:

const mongoose = require('mongoose');
const targetTaskName = "你要匹配的任务名称";
const targetProblemId = "指定的problem id"; // 入参为字符串时需转ObjectId类型

const countResult = await Task.aggregate([
  // 第一步:先筛选name匹配的Task,缩小后续查询范围
  {
    $match: { name: targetTaskName }
  },
  // 第二步:关联查询对应的Question文档
  {
    $lookup: {
      from: "questions", // 此处为Question模型对应MongoDB集合的实际名称,默认是小写复数
      localField: "_id",
      foreignField: "task_id",
      as: "relatedQuestions"
    }
  },
  // 第三步:筛选出存在符合要求关联Question的Task
  {
    $match: {
      relatedQuestions: {
        $elemMatch: {
          problem_id: mongoose.Types.ObjectId(targetProblemId)
        }
      }
    }
  },
  // 第四步:统计总数量
  { $count: "total" }
]);

// 结果处理,无匹配数据时返回0
const finalCount = countResult.length ? countResult[0].total : 0;

方案2:分步查询(逻辑更直观)

代码可读性更高,适合小数据量场景:

const mongoose = require('mongoose');
const targetTaskName = "你要匹配的任务名称";
const targetProblemId = "指定的problem id";

// 第一步:查询所有关联了指定problem的Question对应的task_id并去重
const relatedTaskIds = await Question.distinct("task_id", {
  problem_id: mongoose.Types.ObjectId(targetProblemId)
});

// 第二步:统计符合名称要求、且在上述id范围内的Task数量
const finalCount = await Task.countDocuments({
  name: targetTaskName,
  _id: { $in: relatedTaskIds }
});

两种方案都天然避免了重复统计问题:即使同一个Task对应多个符合条件的Question,也只会被计数1次。

内容的提问来源于stack exchange,提问作者Jude Maranga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:15:00