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:时间大于等于目标日期、距离最近的文档,无符合条件数据时为nullnearestBefore:时间小于目标日期、距离最近的文档,无符合条件数据时为null
如果数据时间跨度极大,可在第一步$match中增加固定时间范围限制(比如目标日期前后7天),可进一步缩小扫描范围、提升查询性能
内容的提问来源于stack exchange,提问作者user12113809
相关产品推荐
相关产品推荐

