MongoDB
MongoDB 引擎是只读表引擎,允许从远程 MongoDB 集合中读取数据。
仅支持 MongoDB v3.6+ 服务器。尚不支持 种子列表 (mongodb+srv
)。
如果您遇到问题,请报告问题,并尝试使用旧版实现。请记住,它已被弃用,并将在后续版本中删除。
创建表
CREATE TABLE [IF NOT EXISTS] [db.]table_name
(
name1 [type1],
name2 [type2],
...
) ENGINE = MongoDB(host:port, database, collection, user, password [, options]);
引擎参数
-
host:port
— MongoDB 服务器地址。 -
database
— 远程数据库名称。 -
collection
— 远程集合名称。 -
user
— MongoDB 用户。 -
password
— 用户密码。 -
options
— MongoDB 连接字符串选项(可选参数)。
如果您正在使用 MongoDB Atlas 云服务,可以从“Atlas SQL”选项获取连接 URL。 种子列表 (mongodb**+srv**
) 尚不支持,但将在未来版本中添加。
此外,您可以直接传递 URI
ENGINE = MongoDB(uri, collection);
引擎参数
-
uri
— MongoDB 服务器的连接 URI -
collection
— 远程集合名称。
类型映射
MongoDB | ClickHouse |
---|---|
bool, int32, int64 | 任何数值类型, String |
double | Float64, String |
date | Date, Date32, DateTime, DateTime64, String |
string | String, UUID |
document | String(as JSON) |
array | Array, String(as JSON) |
oid | String |
binary | String(如果在列中),base64 编码字符串(如果在数组或文档中) |
任何其他 | String |
如果在 MongoDB 文档中找不到键(例如,列名不匹配),则将插入默认值或 NULL
(如果列可为空)。
支持的子句
仅支持带有简单表达式的查询(例如,WHERE field = <constant> ORDER BY field2 LIMIT <constant>
)。此类表达式被转换为 MongoDB 查询语言并在服务器端执行。 您可以使用 mongodb_throw_on_unsupported_query 禁用所有这些限制。 在这种情况下,ClickHouse 会尽力转换查询,但这可能会导致全表扫描和在 ClickHouse 端进行处理。
最好始终显式设置文字类型,因为 Mongo 需要严格类型的过滤器。
例如,您想按 Date
过滤
SELECT * FROM mongo_table WHERE date = '2024-01-01'
这将不起作用,因为 Mongo 不会将字符串转换为 Date
,因此您需要手动转换它
SELECT * FROM mongo_table WHERE date = '2024-01-01'::Date OR date = toDate('2024-01-01')
这适用于 Date
、Date32
、DateTime
、Bool
、UUID
。
使用示例
假设 MongoDB 已加载 sample_mflix 数据集
在 ClickHouse 中创建一个表,该表允许从 MongoDB 集合中读取数据
CREATE TABLE sample_mflix_table
(
_id String,
title String,
plot String,
genres Array(String),
directors Array(String),
writers Array(String),
released Date,
imdb String,
year String,
) ENGINE = MongoDB('mongodb://<USERNAME>:<PASSWORD>@atlas-sql-6634be87cefd3876070caf96-98lxs.a.query.mongodb.net/sample_mflix?ssl=true&authSource=admin', 'movies');
查询
SELECT count() FROM sample_mflix_table
┌─count()─┐
1. │ 21349 │
└─────────┘
-- JSONExtractString cannot be pushed down to MongoDB
SET mongodb_throw_on_unsupported_query = 0;
-- Find all 'Back to the Future' sequels with rating > 7.5
SELECT title, plot, genres, directors, released FROM sample_mflix_table
WHERE title IN ('Back to the Future', 'Back to the Future Part II', 'Back to the Future Part III')
AND toFloat32(JSONExtractString(imdb, 'rating')) > 7.5
ORDER BY year
FORMAT Vertical;
Row 1:
──────
title: Back to the Future
plot: A young man is accidentally sent 30 years into the past in a time-traveling DeLorean invented by his friend, Dr. Emmett Brown, and must make sure his high-school-age parents unite in order to save his own existence.
genres: ['Adventure','Comedy','Sci-Fi']
directors: ['Robert Zemeckis']
released: 1985-07-03
Row 2:
──────
title: Back to the Future Part II
plot: After visiting 2015, Marty McFly must repeat his visit to 1955 to prevent disastrous changes to 1985... without interfering with his first trip.
genres: ['Action','Adventure','Comedy']
directors: ['Robert Zemeckis']
released: 1989-11-22
-- Find top 3 movies based on Cormac McCarthy's books
SELECT title, toFloat32(JSONExtractString(imdb, 'rating')) as rating
FROM sample_mflix_table
WHERE arrayExists(x -> x like 'Cormac McCarthy%', writers)
ORDER BY rating DESC
LIMIT 3;
┌─title──────────────────┬─rating─┐
1. │ No Country for Old Men │ 8.1 │
2. │ The Sunset Limited │ 7.4 │
3. │ The Road │ 7.3 │
└────────────────────────┴────────┘
故障排除
您可以在 DEBUG 级别日志中查看生成的 MongoDB 查询。