如何匹配时间戳大于当前时间截小时后减1小时的MongoDB文档?
解决MongoDB按当前时间截小时后减1小时筛选文档的问题
你的查询写法存在语法错误,导致无法正确生成目标筛选时间,所以没有返回预期结果。正确的做法是使用MongoDB的$dateSubtract操作符来生成"当前时间截小时后减1小时"的时间点,再用于$match筛选。
正确的聚合查询代码
{ $match: { timestamp: { $gte: { $dateSubtract: { startDate: { $dateTrunc: { date: "$$NOW", unit: "hour" } }, unit: "hour", amount: 1 } } } } }
代码解释
$dateTrunc截断当前时间:将$$NOW(当前时间)截断到小时级别,当当前时间是16:20时,会得到2022-11-03T16:00:00.000+00:00。$dateSubtract减去1小时:以截断后的时间为起点,减去1小时,得到2022-11-03T15:00:00.000+00:00。$match筛选文档:匹配所有timestamp大于等于这个时间点的文档,正好符合你预期的两个结果。
替代写法(用毫秒数减法)
如果你习惯用传统的毫秒数计算,也可以这样写:
{ $match: { timestamp: { $gte: { $subtract: [ { $dateTrunc: { date: "$$NOW", unit: "hour" } }, 3600000 ] } } } }
这里3600000是1小时对应的毫秒数,效果和上面的写法完全一致。
错误原因说明
你之前的代码没有正确使用$dateSubtract操作符包裹日期运算参数,而是直接将参数嵌套在$gte的对象里,MongoDB无法识别这种非法的日期条件结构,因此没有返回任何文档。
内容的提问来源于stack exchange,提问作者TheStranger
相关产品推荐
相关产品推荐

