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
相关产品推荐
相关产品推荐

