MongoDB聚合查询:筛选闰年文档并统计数量问题求助
解决MongoDB闰年文档筛选与统计问题
原代码的核心问题
- 运算符误用:判断整除应该用
$mod取余验证余数为0,而非$divide计算商。原代码中用$divide得到的是年份除以4的商,和0比较永远不成立,导致所有leap字段为false。 - 语法错误:聚合表达式的嵌套格式不符合MongoDB规范,比如
"$eq"必须包裹在对象{$eq: [...]}中,原写法会导致语法解析失败。 - 流程缺失:仅生成
leap字段后直接统计所有文档,未过滤非闰年数据,无法得到正确计数。
闰年判断逻辑
符合以下任意一条即为闰年:
- 年份能被4整除,但不能被100整除
- 年份能被400整除
正确实现方案
高效版:先筛选再统计
直接在$match阶段完成闰年判断,过滤出目标文档后统计数量,减少后续处理的数据量:
db.genres.aggregate([ { $match: { $expr: { $and: [ { $eq: [{ $mod: ["$year", 4] }, 0] }, { $or: [ { $ne: [{ $mod: ["$year", 100] }, 0] }, { $eq: [{ $mod: ["$year", 400] }, 0] } ] } ] } } }, { $group: { _id: "leap year", count: { $sum: 1 } } } ])
带标记版:先标记再过滤统计
如果需要保留闰年标记字段,可以先通过$project生成leap字段,再过滤统计:
db.genres.aggregate([ { $project: { title: 1, year: 1, leap: { $and: [ { $eq: [{ $mod: ["$year", 4] }, 0] }, { $or: [ { $ne: [{ $mod: ["$year", 100] }, 0] }, { $eq: [{ $mod: ["$year", 400] }, 0] } ] } ] } } }, { $match: { leap: true } }, { $group: { _id: "leap year", count: { $sum: 1 } } } ])
结果验证
针对提供的文档示例,符合闰年的年份为1996、2000、2004,共3个文档。执行上述查询后将得到预期输出:
{ "_id" : "leap year", "count" : 3 }
内容的提问来源于stack exchange,提问作者DatBigD
相关产品推荐
相关产品推荐

