MongoDB中$getField配合moment.js使用异常 筛选进行中课程未达预期
问题核心原因
你当前的写法存在逻辑冲突:moment() 是客户端运行的JS方法,而 $getField 是MongoDB服务端的聚合操作符,二者运行时序完全分离。你将 $getField 作为参数传入moment时,moment会在查询发送到数据库前就在本地环境执行完成,根本无法读取到数据库文档内的 classStartDate 和 numberOfWeeks 字段值,自然得不到预期结果。
正确实现方案
不要混用客户端方法和MongoDB聚合操作符,全程使用MongoDB内置的运算逻辑完成筛选即可,分两种场景适配:
- 如果你的MongoDB版本≥5.0,且
classStartDate为标准ISO日期类型,推荐使用$dateAdd内置操作符,写法最简洁:
$match: { $expr: { $lt: [ "$$NOW", // MongoDB内置变量,取服务端当前时间,也可替换为客户端传入的当前时间戳 { $dateAdd: { startDate: "$classStartDate", unit: "week", amount: "$numberOfWeeks" } } ] } }
- 如果你的MongoDB版本较低,或
classStartDate存的是毫秒级Unix时间戳,可以用时间戳运算实现:
$match: { $expr: { $lt: [ Date.now(), // 也可替换为 moment(new Date()).valueOf() 传入的客户端当前时间 $add: [ "$classStartDate", $multiply: ["$numberOfWeeks", 7 * 24 * 60 * 60 * 1000] // 周数转成毫秒数 ] ] } }
内容的提问来源于stack exchange,提问作者markcalendario
相关产品推荐
相关产品推荐

