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

MongoDB中能否使用$bucket运算符按日期字段进行分组查询?

MongoDB $bucket按日期字段分组实现说明

$bucket完全支持按日期类型字段进行分组,仅需要保证groupBy指定的字段类型和boundaries数组内的元素类型严格匹配即可,以下是具体实现方案和注意事项:

实现方案

方案1:直接使用Date类型作为边界

适合边界为预设固定日期的场景,比如按预设的活动节点、季度节点划分桶:

{
  $bucket: {
    // 直接指定你要分组的日期字段,比如记录创建时间$createTime
    groupBy: "$createTime",
    // 边界必须为ISODate类型,和groupBy的字段类型匹配
    boundaries: [
      ISODate("2024-01-01T00:00:00Z"),
      ISODate("2024-02-01T00:00:00Z"),
      ISODate("2024-03-01T00:00:00Z"),
      ISODate("2024-04-01T00:00:00Z")
    ],
    default: 'outOfRange',
    output: {
      count: { $sum: 1 },
      localities: { $push: '$$ROOT' }
    }
  }
}

方案2:日期转数值后分桶

适合按固定时间间隔(如7天、1个月)动态分桶的场景,可以先把日期转换为毫秒时间戳或者按粒度截断后的值再分组:

// 先通过$addFields转换日期为时间戳
{
  $addFields: {
    createTimestamp: { $toLong: "$createTime" }
  }
},
{
  $bucket: {
    groupBy: "$createTimestamp",
    // 按7天为间隔的时间戳作为边界,单位毫秒
    boundaries: [
      1704067200000, // 2024-01-01 0点时间戳
      1704672000000, // 2024-01-08 0点时间戳
      1705276800000, // 2024-01-15 0点时间戳
      1705881600000  // 2024-01-22 0点时间戳
    ],
    default: 'overBucket',
    output: {
      count: { $sum: 1 },
      localities: { $push: '$$ROOT' }
    }
  }
}

注意事项

  • groupBy字段和boundaries元素类型必须严格一致,ISODate类型的字段不能和数值类型的边界混用,否则所有文档会被归类到default桶
  • 边界遵循左闭右开规则,和数值分桶逻辑完全相同,比如[a, b)区间仅包含大于等于a、小于b的文档
  • 如果需要按自然月、周、年等通用粒度分桶,也可以搭配$dateTrunc运算符先对日期做截断,再配合$bucketAuto使用,实现更灵活的自动分桶

内容的提问来源于stack exchange,提问作者Alessandro Rhomberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 23:48:01