如何在MongoDB中按日期的月日部分查询Date类型字段?
MongoDB Date类型字段匹配指定月日的查询方法
直接用正则匹配Date类型字段行不通,因为MongoDB里的Date字段存的是ISODate对象,不是字符串,正则是针对字符串的匹配逻辑,自然查不到结果。下面是几种可行的查询方式:
方法一:聚合管道提取月日匹配
利用MongoDB的日期操作符$month和$dayOfMonth,在聚合管道中提取字段的月份和日期,再进行匹配:
// 匹配所有年份中9月11日的文档 db.users.aggregate([ { $match: { $expr: { $and: [ { $eq: [{ $month: "$createdAt" }, 9] }, // 9对应09月 { $eq: [{ $dayOfMonth: "$createdAt" }, 11] } // 11对应11日 ] } } } ])
方法二:匹配多个月日组合
如果需要同时匹配比如09-11和03-22这类多个组合,可以用$in结合字符串拼接实现,注意补零处理个位数的月/日:
db.users.aggregate([ { $match: { $expr: { $in: [ { $concat: [ // 月份补零到2位,比如3月转为"03" { $substrPad: [{ $month: "$createdAt" }, 2, "0", "left"] }, "-", // 日期补零到2位,比如5日转为"05" { $substrPad: [{ $dayOfMonth: "$createdAt" }, 2, "0", "left"] } ] }, ["09-11", "03-22"] // 目标月日组合 ] } } } ])
不推荐的方案:转字符串存储
如果一定要用正则,只能把Date字段额外存为字符串格式(比如"2022-09-11T15:31:25.083+00:00"),然后用正则匹配,但这种方式会浪费存储空间,且丢失Date类型的原生日期操作优势,不建议使用。
内容的提问来源于stack exchange,提问作者mahdi
相关产品推荐
相关产品推荐

