MongoDB聚合中Long类型比较问题及当日文档查询需求
MongoDB聚合匹配当日创建文档的正确实现
问题根源
你之前的写法失效,核心原因是**$match阶段的顶层查询条件不能直接使用聚合表达式(如$toLong、$dateFromString这类操作符)**,这类聚合操作符仅能在$expr内部,或是聚合管道的其他阶段(比如$addFields)中使用。
正确实现方案
要获取当日创建的文档,需先计算出当日0点的时间戳,再通过$expr包裹聚合表达式完成匹配,以下是两种实用写法:
写法一:通过$dateFromString生成当日起始时间并转戳匹配
{ $match: { $expr: { $gte: [ "$StartTime", { $toLong: { $dateFromString: { dateString: { $dateToString: { format: "%Y-%m-%d", date: "$$NOW" } }, format: "%Y-%m-%d" } } } ] } } }
写法二:用$trunc直接截断时间到当日起始点(更简洁)
{ $match: { $expr: { $gte: [ "$StartTime", { $toLong: { $trunc: { date: "$$NOW", unit: "day" } } } ] } } }
补充:严格匹配当日文档
如果需要严格限定为当日(小于次日0点),可添加$lt条件:
{ $match: { $expr: { $and: [ { $gte: ["$StartTime", { $toLong: { $trunc: { date: "$$NOW", unit: "day" } } }] }, { $lt: ["$StartTime", { $toLong: { $add: [{ $trunc: { date: "$$NOW", unit: "day" } }, 86400000] } }] } ] } } }
另外你第一个直接用数字时间戳的写法能生效,是因为那是查询语法支持的常量值,不属于聚合表达式范畴,所以$match可以直接识别。
内容的提问来源于stack exchange,提问作者mormorion
相关产品推荐
相关产品推荐

