跳到主要内容
跳到主要内容

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

类型映射

MongoDBClickHouse
bool, int32, int64任何数字类型, String
doubleFloat64, String
dateDate, Date32, DateTime, DateTime64, String
stringString
documentString(作为 JSON)
arrayArray, String(作为 JSON)
oidString
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,因此您需要手动转换:

这适用于 DateDate32DateTimeBoolUUID

使用示例

假设 MongoDB 中已加载 sample_mflix 数据集

在 ClickHouse 中创建一个表,以允许从 MongoDB 集合读取数据:

查询:

故障排除

您可以在 DEBUG 级别的日志中查看生成的 MongoDB 查询。

实现细节可以在 mongocxxmongoc 文档中找到。