Apache Drill连接MongoDB按日期查询无结果问题求助
解决Apache Drill对接MongoDB日期字段查询无结果的问题
问题根源
MongoDB中datetime字段存储的是BSON Date类型(本质是毫秒级时间戳),直接用字符串格式的日期匹配属于类型不匹配,导致Drill无法完成正确的等值匹配。转为字符串查询时触发了隐式类型转换,把MongoDB的Date类型转成字符串后才匹配成功,但这种方式会影响查询性能,且无法利用字段索引。
解决方案
1. 显式转换字符串为Drill时间戳类型
用Drill内置的TIMESTAMP或TO_TIMESTAMP函数,将日期字符串转为对应时间戳类型后匹配:
-- 直接用TIMESTAMP关键字转换 select * from mongo.test.users where datetime = TIMESTAMP '2022-07-28T05:16:42.877+00:00'; -- 或者指定格式的TO_TIMESTAMP函数 select * from mongo.test.users where datetime = TO_TIMESTAMP('2022-07-28T05:16:42.877+00:00', 'yyyy-MM-dd''T''HH:mm:ss.SSSXXX');
2. 使用MongoDB原生时间戳构造查询
将日期转为毫秒级时间戳,通过Drill的mongo_date函数构造BSON Date类型匹配:
-- 2022-07-28T05:16:42.877+00:00对应的毫秒时间戳是1658990202877 select * from mongo.test.users where datetime = mongo_date(1658990202877);
3. 检查Drill的MongoDB存储插件配置
确认Drill的MongoDB存储插件配置文件(通常路径为conf/storage-plugins-override.conf)中,read_date_as_string参数未被设为true。若该参数为true,Drill会将MongoDB的Date类型默认转为字符串存储,导致原生Date类型的查询逻辑失效,默认该参数为false无需修改。
注意事项
- 优先用显式类型转换查询,避免隐式转换带来的性能损耗,尤其是
datetime字段有索引时,显式匹配能让Drill更好利用MongoDB的索引优化查询。 - 批量处理日期查询时,建议提前统一日期格式转换逻辑,减少重复转换操作。
内容的提问来源于stack exchange,提问作者pramod kale
相关产品推荐
相关产品推荐

