MongoDB
MongoDB 引擎是一个只读表引擎,允许从远程 MongoDB 集合中读取数据。
只支持 MongoDB 服务器 v3.6+。
种子列表(mongodb+srv
) 目前不支持。
创建表
引擎参数
-
host:port
— MongoDB 服务器地址。 -
database
— 远程数据库名称。 -
collection
— 远程集合名称。 -
user
— MongoDB 用户。 -
password
— 用户密码。 -
options
— MongoDB 连接字符串选项(可选参数)。 -
oid_columns
- 需要在 WHERE 子句中视为oid
的列的以逗号分隔的列表。默认为_id
。
如果您使用的是 MongoDB Atlas 云服务,连接 URL 可以从 'Atlas SQL' 选项中获得。
种子列表(mongodb**+srv**
) 目前不支持,但将在未来版本中添加。
作为替代,您可以传递 URI:
引擎参数
-
uri
— MongoDB 服务器的连接 URI。 -
collection
— 远程集合名称。 -
oid_columns
- 需要在 WHERE 子句中视为oid
的列的以逗号分隔的列表。默认为_id
。
类型映射
MongoDB | ClickHouse |
---|---|
bool, int32, int64 | 任何数字类型, String |
double | Float64, String |
date | Date, Date32, DateTime, DateTime64, String |
string | String |
document | String(作为 JSON) |
array | Array, String(作为 JSON) |
oid | String |
binary | 如果在列中则为 String,如果在数组或文档中则为 base64 编码字符串 |
uuid (binary subtype 4) | UUID |
其他 | String |
如果在 MongoDB 文档中未找到键(例如,列名不匹配),则将插入默认值或 NULL
(如果该列是可空的)。
OID
如果您希望将 String
视为 WHERE 子句中的 oid
,只需将列的名称放在表引擎的最后一个参数中。
当按 _id
列查询记录时,这可能是必要的,因为在 MongoDB 中 _id
默认具有 oid
类型。
如果表中的 _id
字段具有其他类型,例如 uuid
,则需要指定空的 oid_columns
,否则将使用此参数的默认值 _id
。
默认情况下,只有 _id
被视为 oid
列。
在这种情况下,输出将是 0
,因为 ClickHouse 并不知道 another_oid_column
具有 oid
类型,因此我们来修复它:
支持的子句
仅支持具有简单表达式的查询(例如,WHERE field = <constant> ORDER BY field2 LIMIT <constant>
)。
此类表达式将被转换为 MongoDB 查询语言,并在服务器端执行。
您可以使用 mongodb_throw_on_unsupported_query 禁用所有这些限制。
在这种情况下,ClickHouse 会尽力转换查询,但这可能会导致全表扫描和在 ClickHouse 端的处理。
明确设置文字的类型总是更好,因为 Mongo 要求严格的类型过滤。
例如,您想按 Date
进行过滤:
这将不起作用,因为 Mongo 不会将字符串转换为 Date
,因此您需要手动转换:
这适用于 Date
,Date32
,DateTime
,Bool
,UUID
。
使用示例
假设 MongoDB 中已加载 sample_mflix 数据集
在 ClickHouse 中创建一个表,以允许从 MongoDB 集合读取数据:
查询:
故障排除
您可以在 DEBUG 级别的日志中查看生成的 MongoDB 查询。