如何在MongoDB中仅按日期维度查询日期字段忽略时分秒
MongoDB按天维度匹配日期查询方案
方案1:范围查询(推荐)
该方案支持命中deliveryDate字段的普通索引,大数据量下查询性能最优:
- 构造目标日期当天的0点整作为起始时间,目标日期下一天的0点整作为结束时间
- 用
$gte+$lt的范围条件匹配落在该区间内的所有日期数据
示例代码:
// 目标查询日期:2021年8月13日 const targetDayStart = new Date('2021-08-13T00:00:00.000Z'); const nextDayStart = new Date('2021-08-14T00:00:00.000Z'); model.find({ deliveryDate: { $gte: targetDayStart, $lt: nextDayStart } })
方案2:聚合日期字段匹配(仅适合小数据量场景)
如果数据量很小不需要考虑索引命中,也可以直接提取日期的年、月、日字段匹配:
model.find({ $expr: { $and: [ // 匹配年份2021 { $eq: [{ $year: "$deliveryDate" }, 2021] }, // 匹配月份8月 { $eq: [{ $month: "$deliveryDate" }, 8] }, // 匹配当月13日 { $eq: [{ $dayOfMonth: "$deliveryDate" }, 13] } ] } })
该方案需要对每条查询数据做日期计算,无法命中deliveryDate的普通索引,数据量超过万级不推荐使用。
注意事项
你当前使用的查询语句中日期字符串new Date("021-08-13T18:30:00.000Z")的年份缺失了前导的数字2,会生成错误的日期对象,需要修正为2021-08-13开头的合法格式。
内容的提问来源于stack exchange,提问作者AsZik
相关产品推荐
相关产品推荐

