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

基于MongoDB实现2015-2018年指定月份首条有效语句查询

MongoDB 查询:2015-2018年指定月份的第一条有效sentence记录

没问题,我来帮你搞定这个查询需求。咱们拆解一下要做的事:先筛选出2015到2018年间、带有非空sentence字段的记录,再按年份-月份分组,取出每个月里最早出现的那条有效记录的内容。

聚合查询代码

db.yourCollectionName.aggregate([
  // 第一步:过滤时间范围和有效sentence记录
  {
    $match: {
      date: {
        $gte: ISODate("2015-01-01T00:00:00Z"),
        $lte: ISODate("2018-12-31T23:59:59Z")
      },
      sentence: { $exists: true, $ne: "" } // 确保sentence存在且非空
    }
  },
  // 第二步:按日期升序排序,保证每个月的第一条是最早的记录
  { $sort: { date: 1 } },
  // 第三步:按年份和月份分组,取每组的第一条记录
  {
    $group: {
      _id: {
        year: { $year: "$date" },
        month: { $month: "$date" }
      },
      firstSentence: { $first: "$sentence" },
      firstOccurrenceDate: { $first: "$date" }
    }
  },
  // 第四步:可选,调整输出格式,让结果更直观
  {
    $project: {
      _id: 0,
      yearMonth: {
        $concat: [
          { $toString: "$_id.year" },
          "-",
          { $toString: "$_id.month" }
        ]
      },
      firstSentence: 1,
      firstOccurrenceDate: 1
    }
  }
])

代码解释

  • $match阶段:精准过滤时间范围(2015年1月1日到2018年12月31日),同时排除没有sentence字段或sentence为空的无效记录。
  • $sort阶段:按date字段升序排列,这样每个月的第一条记录就是该月最早出现的有效内容。
  • $group阶段:用$year和$month从date中提取年份和月份作为分组依据,然后用$first获取每组的第一条sentence和对应的日期。
  • $project阶段:可选步骤,把年份和月份拼接成YYYY-MM格式,同时隐藏默认的_id字段,让输出结果更易读。

针对你的测试数据的输出结果

基于你提供的记录,运行这个查询后会得到:

[
  {
    "firstSentence": "Lorem ipsum",
    "firstOccurrenceDate": ISODate("2015-04-04T10:01:00Z"),
    "yearMonth": "2015-4"
  },
  {
    "firstSentence": "amet,",
    "firstOccurrenceDate": ISODate("2017-01-04T09:10:00Z"),
    "yearMonth": "2017-1"
  }
]

(注:2016年5月的记录没有sentence字段,会被过滤掉;2019年的记录超出时间范围,也不会被包含在内)

内容的提问来源于stack exchange,提问作者joe.kovalski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:14:01