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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:54:51