MongoDB如何使用通配符匹配ISODate的00:00:00时间部分?
错误原因
ISODate()仅支持传入符合ISO 8601规范的标准日期字符串,不支持直接传入正则表达式作为入参,因此你之前的写法会触发参数类型不匹配的报错。
正确实现方案
兼容全版本实现(推荐无版本限制场景使用)
通过聚合框架的$dateToString操作符将日期字段的时分秒部分提取为字符串,直接匹配00:00:00即可:
db.CustomerSubscriptions.aggregate([ { $match: { $expr: { $eq: [ { $dateToString: { format: "%H:%M:%S", date: "$UpcomingOrders.NextOrderDate" } }, "00:00:00" ] } } } ])
MongoDB 5.0+ 高性能实现
如果你的数据库版本≥5.0,可以使用$dateTrunc操作符做更高效的匹配:将日期按天截断后和原日期对比,相等则说明时分秒部分全为0,该写法支持命中日期字段的索引,查询性能更高:
db.CustomerSubscriptions.find({ $expr: { $eq: [ "$UpcomingOrders.NextOrderDate", { $dateTrunc: { date: "$UpcomingOrders.NextOrderDate", unit: "day" } } ] } })
特殊场景适配
如果UpcomingOrders是数组类型,需要先通过$unwind拆分数组后再执行匹配:
db.CustomerSubscriptions.aggregate([ { $unwind: "$UpcomingOrders" }, { $match: { $expr: { $eq: [ { $dateToString: { format: "%H:%M:%S", date: "$UpcomingOrders.NextOrderDate" } }, "00:00:00" ] } } } ])
内容的提问来源于stack exchange,提问作者Yeetus2002
相关产品推荐
相关产品推荐

