无法通过Presto查询MongoDB数据 请求技术协助
db.collection.find({})一致的结果 我帮你一步步排查这两个问题,同时实现你想要的和MongoDB原生查询一致的结果:
先分析你遇到的两个错误
1. SELECT * not allowed in queries without FROM clause
这个报错看起来矛盾,因为你明明写了FROM子句,本质原因是Presto的MongoDB连接器没有正确识别你指定的集合路径,导致SQL解析器认为你的查询没有有效的FROM子句。大概率是你使用的<catalog>.<schema>.<collection>路径有误,或者连接器元数据缓存出了问题。
2. Column 'name' cannot be resolved
这个问题是因为Presto对MongoDB的无Schema文档做了字段推断,如果你的文档结构嵌套、字段名大小写不匹配,或者连接器采样的文档里没有name字段,就会出现这个错误。
一步步解决问题
1. 确认Catalog配置与查询路径的正确性
首先检查你的etc/catalog/mongodb.properties基础配置是否正确,示例配置如下:
connector.name=mongodb mongodb.seeds=你的MongoDB地址:端口 # 比如localhost:27017 mongodb.auth-source=admin # 如果开启了认证,填写认证库 # 可选:指定默认数据库,不填的话需要在SQL里明确指定schema(即MongoDB的database) # mongodb.database=your_default_db
然后验证查询路径:
- 执行
SHOW SCHEMAS IN mongodb;,确认你要查询的MongoDB数据库(对应Presto的schema)存在; - 执行
SHOW TABLES IN mongodb.your_db_name;,确认目标集合(对应Presto的table)存在; - 确保你的查询语句里的路径是
mongodb.your_db_name.your_collection,替换成实际的库名和集合名,比如:SELECT * FROM mongodb.test.users;
如果路径正确但还是报错,执行SYNC TABLE mongodb.your_db_name.your_collection;刷新元数据,或者重启Presto服务清除缓存。
2. 获取与db.collection.find({})一致的完整文档
如果你想直接获取和MongoDB原生查询一样的完整文档格式,不需要查询单个字段,Presto的MongoDB连接器提供了一个隐藏列_document,它会返回整个文档的JSON字符串,完全对应db.collection.find({})的输出:
SELECT _document FROM mongodb.your_db_name.your_collection;
这个列返回的结果就是完整的BSON文档转成的JSON格式,和你在MongoDB Shell里看到的结果一致。
3. 解决字段找不到的问题
如果你确实需要查询单个字段,先执行DESCRIBE mongodb.your_db_name.your_collection;查看Presto识别到的所有字段结构:
- 如果字段是嵌套的,需要用点符号访问,比如文档是
{"user": {"name": "Alice"}},那查询语句应该是SELECT user.name FROM ...; - 如果Presto没有识别到某个字段,说明连接器采样的文档里没有这个字段,你可以调整配置增大采样数:
在mongodb.properties里添加:
重启Presto后,再执行# 增大元数据采样的文档数量,确保覆盖所有字段 mongodb.metadata-sample-size=1000 # 禁用元数据缓存,方便测试时实时更新 mongodb.metadata-cache-ttl=0DESCRIBE查看字段是否正常识别。
总结
先确认查询路径和配置的正确性,用_document列可以直接获取完整的文档格式,和MongoDB原生查询结果一致;如果要查询单个字段,先通过DESCRIBE确认字段的正确写法,必要时调整元数据采样配置。
内容的提问来源于stack exchange,提问作者Niheel Thakkar

