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

MongoDB如何查询指定日期前后大于、小于该日期的最接近文档

实现方案

是可以实现该需求的,你原有代码仅完成了时间范围的过滤,没有做最近文档的筛选逻辑,可通过$facet聚合算子同时处理两个时间方向的查询逻辑,具体实现如下:

前置准备

建议先为timestamp字段添加单字段升序索引,大幅提升查询性能:

db.collection.createIndex({timestamp: 1})

聚合查询代码

const targetDate = new Date("2021-05-27T14:40:46Z")
db.collection.aggregate([
  // 缩小查询范围,过滤掉无时间戳字段的无效文档
  {
    $match: {
      timestamp: { $exists: true }
    }
  },
  // 拆分两个并行查询管道,分别处理两个时间方向的筛选逻辑
  {
    $facet: {
      // 匹配大于等于目标日期的文档,按时间升序排序后取第一条,即为最接近目标日期的后续文档
      "nearestAfter": [
        { $match: { timestamp: { $gte: targetDate } } },
        { $sort: { timestamp: 1 } },
        { $limit: 1 }
      ],
      // 匹配小于目标日期的文档,按时间降序排序后取第一条,即为最接近目标日期的前置文档
      "nearestBefore": [
        { $match: { timestamp: { $lt: targetDate } } },
        { $sort: { timestamp: -1 } },
        { $limit: 1 }
      ]
    }
  },
  // 可选步骤:将返回的数组结构转为单个对象,无匹配数据时返回null,方便后续业务逻辑处理
  {
    $project: {
      nearestAfter: { $first: "$nearestAfter" },
      nearestBefore: { $first: "$nearestBefore" }
    }
  }
])

返回结果说明

  • nearestAfter:时间大于等于目标日期、距离最近的文档,无符合条件数据时为null
  • nearestBefore:时间小于目标日期、距离最近的文档,无符合条件数据时为null

如果数据时间跨度极大,可在第一步$match中增加固定时间范围限制(比如目标日期前后7天),可进一步缩小扫描范围、提升查询性能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:51:00