MongoDB集合缺失数据检索:跨日期查询缺课学生实现
可行性结论
这类针对集合内缺失记录的比对查询需求,MongoDB 完全可以原生支持实现,不需要拉取全量数据到应用层做二次计算。
你当前的核心计算逻辑为:筛选出基准日期(2021-04-29)在A班有出勤记录,但在目标日期(2021-04-30)无对应考勤记录的缺课学生,全流程可通过MongoDB聚合管道完成计算。
具体实现思路
整体查询围绕两个对比名单的差集计算展开,步骤为:
- 先通过条件匹配,筛选出A班、两个对比日期范围内的所有有效考勤记录
- 按班级维度分组,分别收集基准日期、目标日期的出勤学生名单
- 对两个学生名单做集合差运算:从基准出勤名单里剔除所有在目标日期有出勤记录的学生,剩下的就是目标日期的缺课学生
- 拆分差集结果,把原
student字段重命名为要求的name字段,整理成指定的输出格式
可直接运行的查询代码
db.Students.aggregate([ // 筛选A班、两个对比日期的考勤记录 { $match: { class: "A", date: { $in: ["2021-04-29", "2021-04-30"] } } }, // 按班级分组,收集两个日期的学生名单 { $group: { _id: "$class", baselineList: { $addToSet: { $cond: { if: { $eq: ["$date", "2021-04-29"] }, then: "$student", else: "$$REMOVE" } } }, targetList: { $addToSet: { $cond: { if: { $eq: ["$date", "2021-04-30"] }, then: "$student", else: "$$REMOVE" } } } } }, // 计算两个名单的差集 { $project: { _id: 0, class: "$_id", absentStudents: { $setDifference: ["$baselineList", "$targetList"] } } }, // 拆分结果为单条文档,重命名字段匹配输出格式 { $unwind: "$absentStudents" }, { $project: { name: "$absentStudents", class: 1 } } ])
补充说明
如果后续需要把班级固定注册学生作为基准名单(而不是以上一日期的出勤名单为基准),只需要替换聚合流程里的baselineList来源为你维护的班级固定名册即可,差集计算的核心逻辑不需要调整。
内容的提问来源于stack exchange,提问作者fuchcar
相关产品推荐
相关产品推荐

