You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 15:54:24