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

MongoDB动态字段值文档查询:基于条件的动态日期运算问题

问题原因分析

你的代码核心问题是在MongoDB查询的$expr中使用了客户端的moment.js库,这会导致两个严重问题:

  • moment是在本地执行的,无法读取MongoDB文档中的$kdsConfig字段值,只能把字符串"$kdsConfig.ps_screen_preparing_time"当作固定参数传入,完全达不到动态计算的效果。
  • MongoDB的查询表达式不识别moment的语法,服务器端无法解析这个客户端函数。

必须改用MongoDB原生的聚合日期操作符,在服务器端完成动态日期计算。

正确实现方案

核心思路

  1. 用$currentDate获取MongoDB服务器的当前时间(避免客户端与服务器时间差)。
  2. 用$cond根据progress_status_kd的值,选择对应的时间差字段:
    • 当值为33时,取kdsConfig.ps_screen_preparing_time(小时),转成毫秒后从当前时间减去。
    • 当值为32时,取kdsConfig.ps_screen_packaging_time(分钟),转成毫秒后从当前时间减去。
  3. 如果progress_status_kd_updated_at是字符串格式,需要用$dateFromString转成MongoDB日期类型再比较。

完整代码

const orders = await db1.db.collection("order_all").find({
    progress_status_kd: { $in: [32, 33] },
    ps_screen_preparing_n_packaging_permission: true,
    $expr: {
        $lte: [
            // 把字符串日期转成MongoDB日期类型(如果字段已经是Date类型可以省略这一步)
            { $dateFromString: { dateString: "$progress_status_kd_updated_at" } },
            {
                $cond: [
                    { $eq: ["$progress_status_kd", 33] },
                    // 减去指定小时数:1小时=3600000毫秒
                    { $subtract: [ "$currentDate", { $multiply: ["$kdsConfig.ps_screen_preparing_time", 3600000] } ] },
                    // 减去指定分钟数:1分钟=60000毫秒
                    { $subtract: [ "$currentDate", { $multiply: ["$kdsConfig.ps_screen_packaging_time", 60000] } ] }
                ]
            }
        ]
    }
}).toArray();

关键细节说明

  • $currentDate:返回MongoDB服务器的当前时间(UTC时间,注意和业务时间时区的匹配)。
  • 时间单位转换:MongoDB的日期计算基于毫秒,所以需要把小时/分钟转成毫秒(小时×3600000,分钟×60000)。
  • 日期类型转换:如果你的progress_status_kd_updated_at字段存储的是MongoDB原生Date类型,直接用"$progress_status_kd_updated_at"即可,无需$dateFromString。

数据样例验证

针对你提供的样例数据:

  • progress_status_kd=33,ps_screen_preparing_time=10小时,计算出的阈值时间是当前时间 - 10小时。
  • 样例中的progress_status_kd_updated_at="2025-05-07 14:00:00",如果当前时间是2025-05-07 14:00:00,阈值时间是2025-05-07 04:00:00,14:00:00大于04:00:00,所以该文档不会被筛选出来;如果updated_at是2025-05-07 03:00:00,就会被选中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 05:18:18