基于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
相关产品推荐
相关产品推荐

