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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 06:10:29