Node.js环境下MongoDB日期查询$lte操作符结果不符合预期问题
问题原因排查
1. 字段路径错误
你提供的文档结构中,orderdate、history均为顶层字段,查询语句中额外添加了purchaseorder.前缀,会尝试匹配嵌套对象purchaseorder下的字段,无法匹配到文档的实际字段。
2. 日期范围不匹配
目标文档的orderdate值为2021-08-09T11:02:31.202+00:00,但你设置的startDate和endDate均为2021-08-08T19:00:00.000Z,时间范围完全没有覆盖目标文档的orderdate,自然无法返回结果。
3. 字段类型不匹配(潜在问题)
从你给出的文档结构看,orderdate存储为字符串类型,而你查询时使用new Date()生成的是Date类型对象,虽然ISO格式的日期字符串字典序与时间顺序一致,但不同类型比较仍可能出现不可预期的问题。
解决方法
- 移除查询语句中不必要的
purchaseorder.字段前缀 - 调整
startDate和endDate范围,使其覆盖你需要查询的时间区间,例如要查询2021-08-09全天的订单,可将参数设置为:startDate:2021-08-09T00:00:00.000ZendDate:2021-08-09T23:59:59.999Z
- 建议将存量数据的
orderdate字段统一更新为MongoDB的Date类型,避免类型不匹配引发的查询异常。
修正后的查询示例
如果orderdate已改为Date类型:
"$match": { "$and": [ { "orderdate": { $gte: new Date(startDate), $lte: new Date(endDate) } }, { "history": false } ] }
如果orderdate仍为字符串类型:
"$match": { "$and": [ { "orderdate": { $gte: startDate, $lte: endDate } }, { "history": false } ] }
内容的提问来源于stack exchange,提问作者Saani
相关产品推荐
相关产品推荐

