Mongoose 7.0.3中如何用$and对日期子字段执行精确查询?
解决Mongoose 7.0.3中使用$and进行日期子字段精确查询的问题
针对你遇到的问题,核心原因是Mongoose的日期类型处理逻辑与mongosh存在差异,尤其是在strict: false的Schema下,未显式定义的字段可能存在隐式转换问题,再加上时区差异可能导致匹配失败。以下是可行的解决方法:
1. 明确指定UTC时区的完整日期字符串
MongoDB存储的Date类型是UTC时间(带毫秒精度),如果你的代码运行环境不是UTC时区,直接使用new Date('2021-07-01')会生成本地时区的0点,转换成UTC后与数据库中存储的时间不匹配。需要显式指定UTC时区的完整格式:
wb_collection_tracking_for_testing.countDocuments({ '$and': [ { 'CurrentState.start_date': new Date('2021-07-01T00:00:00.000Z') } ] })
2. 用$eq操作符显式匹配日期
显式使用$eq操作符可以避免Mongoose的隐式类型转换干扰,确保查询条件的Date对象与数据库中的Date类型完全匹配:
wb_collection_tracking_for_testing.countDocuments({ '$and': [ { 'CurrentState.start_date': { $eq: new Date('2021-07-01T00:00:00.000Z') } } ] })
3. 确保Schema字段定义生效
虽然你已经给Schema添加了CurrentState.start_date: Date,但由于之前使用了strict: false,Mongoose可能缓存了旧的Schema配置。可以重启服务,或者通过重新编译模型来刷新配置:
// 重新编译模型(基于更新后的Schema) const TrackingModel = mongoose.model('wb_collection_tracking_for_testing', yourUpdatedSchema);
额外排查点
- 确认查询的日期与数据库中存储的日期完全一致(注意年份、月份是否对应,比如你示例文档中的日期是2022-01-01,但查询用的是2021-07-01,需确保测试数据匹配)
- 检查数据库中
start_date的实际存储类型:在mongosh中执行db.wb_collection_tracking_for_testing.findOne({}, { 'CurrentState.start_date': 1 }).CurrentState.start_date,确认返回结果是Date类型而非字符串
内容的提问来源于stack exchange,提问作者Dmitry Malugin
相关产品推荐
相关产品推荐

