MongoDB中ISODate类型字段正则过滤方法及匹配无结果原因解析
MongoDB中ISODate字段的正则过滤器行为解析
嘿,我来帮你搞明白这个问题~
首先,你尝试的查询 db.collection.find({"ReportedDate":/2016/i}) 没有返回结果,核心原因很简单:MongoDB的ISODate是日期类型的BSON对象,不是字符串,而正则表达式只能用来匹配字符串类型的数据。
这个查询的具体行为
当你对日期类型字段使用正则过滤器时,MongoDB不会把日期对象自动转换成我们肉眼看到的 "2016-xx-xxTxx:xx:xxZ" 格式字符串去匹配正则。它会直接把正则表达式和日期对象的底层存储形式(一个代表自纪元以来毫秒数的64位整数)做匹配——显然,正则 /2016/i 和这个整数完全不沾边,所以自然查不到任何结果。
简单说:正则是给字符串用的,日期类型不吃这一套。
额外补充:如果要匹配年份的正确姿势
虽然你说不需要替代方案,但还是提一下方便你参考:
- 日期范围查询(推荐,能利用索引):
db.collection.find({ "ReportedDate": { $gte: ISODate("2016-01-01T00:00:00Z"), $lt: ISODate("2017-01-01T00:00:00Z") } }) - 聚合查询匹配年份:
db.collection.aggregate([ { $match: { $expr: { $eq: [{ $year: "$ReportedDate" }, 2016] } } } ])
内容的提问来源于stack exchange,提问作者Sameer
相关产品推荐
相关产品推荐

