MongoDB 表引擎
MongoDB 引擎是一种只读表引擎,用于从远程 MongoDB 集合中读取数据。
仅支持 MongoDB v3.6 及更高版本的服务器。
尚不支持 种子列表(mongodb+srv)。
创建表
引擎参数
| 参数 | 描述 |
|---|---|
host:port | MongoDB 服务器地址。 |
database | 远程数据库名称。 |
collection | 远程集合名称。 |
user | MongoDB 用户。 |
password | 用户密码。 |
options | 可选。以 URL 格式字符串形式提供的 MongoDB 连接字符串选项,例如:'authSource=admin&ssl=true'。 |
oid_columns | 以逗号分隔的列名列表,这些列在 WHERE 子句中将被视为 oid。默认值为 _id。 |
如果你使用的是 MongoDB Atlas 云服务,可以从 “Atlas SQL” 选项中获取连接 URL。
种子列表(mongodb**+srv**)目前尚不支持,但会在后续版本中加入。
或者,你也可以传入一个 URI:
引擎参数
| 参数 | 说明 |
|---|---|
uri | MongoDB 服务器的连接 URI。 |
collection | 远程集合的名称。 |
oid_columns | 以逗号分隔的列名列表,这些列在 WHERE 子句中将被视为 oid 类型。默认值为 _id。 |
类型映射
| MongoDB | ClickHouse |
|---|---|
| bool, int32, int64 | 除 Decimal 外的任意数值类型,Boolean,String |
| double | Float64,String |
| date | Date,Date32,DateTime,DateTime64,String |
| string | String,如果格式正确,则为除 Decimal 外的任意数值类型 |
| document | String(作为 JSON) |
| array | Array,String(作为 JSON) |
| oid | String |
| binary | 如果在列中则为 String,如果在数组或文档中则为 base64 编码的字符串 |
| uuid (binary subtype 4) | UUID |
| any other | String |
如果在 MongoDB 文档中未找到键(例如列名不匹配),将插入默认值,或者在列可为 NULL 的情况下插入 NULL。
OID
如果希望在 WHERE 子句中将某个 String 视为 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 查询。