MongoDB查询:匹配今日日期+$in操作符的实现问题
解决方案
首先明确:你的date_array是键值对对象而非数组,$in运算符无法直接作用于这个字段。同时文档中的日期都是当天0点整,之前的写法要么日期格式错误,要么包含时分秒导致匹配失败,以下是正确实现方式:
核心思路
- 用
$objectToArray将date_array对象转换为键值对数组 - 通过
$anyElementTrue+$map检查数组中是否存在任意一个日期值落在当天时间范围内 - 构造当天起始(00:00:00)和次日起始(00:00:00)的时间区间,规避时分秒的匹配问题
静态日期查询(指定某一天)
如果要查询2023-01-03的文档,直接构造对应时间范围:
db.collection.find({ $expr: { $anyElementTrue: { $map: { input: { $objectToArray: "$date_array" }, as: "item", in: { $and: [ { $gte: ["$$item.v", new Date("2023-01-03T00:00:00.000Z")] }, { $lt: ["$$item.v", new Date("2023-01-04T00:00:00.000Z")] } ] } } } } })
动态日期查询(自动匹配当前日期)
如果要自动匹配服务器当前日期,先构造当天的时间范围:
// 生成当天0点和次日0点的时间 const todayStart = new Date(); todayStart.setHours(0, 0, 0, 0); const todayEnd = new Date(todayStart); todayEnd.setDate(todayEnd.getDate() + 1); // 执行查询 db.collection.find({ $expr: { $anyElementTrue: { $map: { input: { $objectToArray: "$date_array" }, as: "item", in: { $and: [ { $gte: ["$$item.v", todayStart] }, { $lt: ["$$item.v", todayEnd] } ] } } } } })
之前写法失败的原因
- 第一种写法:若日期字符串格式错误(比如保留
<YYYY-mm-dd>占位符未替换)会触发语法错误,且$in无法作用于对象类型的date_array - 第二种写法:
new Date()会生成包含当前时分秒的日期,与文档中0点整的日期无法精准匹配
内容的提问来源于stack exchange,提问作者keynesiancross
相关产品推荐
相关产品推荐

