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

MongoDB聚合中如何基于两个日期时间范围查询数据?

问题原因

常规的$match查询语法无法引用聚合阶段(比如$addFields)生成的字段,你写的$gte: "$FromDate"会被MongoDB当作字符串字面量处理,而不是指向之前生成的FromDate字段,所以匹配失效。

解决方案

改用$expr编写匹配逻辑,它支持在查询中引用文档字段(包括聚合阶段生成的字段),通过表达式完成日期范围判断:

修改后的聚合代码如下:

const Objdata = await Events.aggregate([
  {
    $lookup: {
      from: "MeetingReminderSetting",
      let: {
        flag: false,
        cid: "$ClientID",
        esd: "$EventStartDtByTimeZone",
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                { $eq: ["$IsDeleted", "$$flag"] },
                { $eq: ["$ClientID", "$$cid"] },
              ],
            },
          },
        },
      ],
      as: "p1",
    },
  },
  {
    $unwind: {
      path: "$p1",
      preserveNullAndEmptyArrays: false,
    },
  },
  {
    $addFields: {
      FromDate: {
        $dateAdd: {
          startDate: new Date("2022-01-01T00:00:00.000+00:00"),
          unit: "hour",
          amount: 24,
        },
      },
      Todate: {
        $dateAdd: {
          startDate: {
            $dateAdd: {
              startDate: new Date("2022-01-01T00:00:00.000+00:00"),
              unit: "hour",
              amount: 24,
            },
          },
          unit: "minute",
          amount: 10,
        },
      },
    },
  },
  // 修改后的$match阶段
  {
    $match: {
      $expr: {
        $and: [
          { $gte: ["$EventStartDtByTimeZone", "$FromDate"] },
          { $lte: ["$EventStartDtByTimeZone", "$Todate"] }
        ]
      }
    }
  },
]);
额外说明
  • 无需用$dateToString转换日期后比较:直接比较Date类型值才是正确的日期逻辑,字符串比较按字符顺序判断,可能出现不符合预期的结果(比如"2023-12-01"和"2023-2-01"的字符串顺序与日期顺序不一致)。
  • 若FromDate和Todate仅用于范围匹配,可进一步优化:将日期计算直接放到$expr里,省去$addFields阶段以减少内存占用,示例如下:
// 优化后的聚合(去掉$addFields,直接在$match里计算日期)
const Objdata = await Events.aggregate([
  {
    $lookup: {
      from: "MeetingReminderSetting",
      let: {
        flag: false,
        cid: "$ClientID",
        esd: "$EventStartDtByTimeZone",
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                { $eq: ["$IsDeleted", "$$flag"] },
                { $eq: ["$ClientID", "$$cid"] },
              ],
            },
          },
        },
      ],
      as: "p1",
    },
  },
  {
    $unwind: {
      path: "$p1",
      preserveNullAndEmptyArrays: false,
    },
  },
  {
    $match: {
      $expr: {
        $and: [
          { 
            $gte: [
              "$EventStartDtByTimeZone",
              { $dateAdd: { startDate: new Date("2022-01-01T00:00:00.000+00:00"), unit: "hour", amount: 24 } }
            ]
          },
          { 
            $lte: [
              "$EventStartDtByTimeZone",
              { 
                $dateAdd: {
                  startDate: { $dateAdd: { startDate: new Date("2022-01-01T00:00:00.000+00:00"), unit: "hour", amount: 24 } },
                  unit: "minute",
                  amount: 10
                }
              }
            ]
          }
        ]
      }
    }
  },
]);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:36:26