7.4 KiB
slug | sidebar_position | sidebar_label |
---|---|---|
/ja/engines/table-engines/integrations/mongodb | 135 | MongoDB |
MongoDB
MongoDB エンジンはリモート MongoDB コレクションからデータを読み取るための読み取り専用テーブルエンジンです。
MongoDB v3.6+ サーバーのみがサポートされています。
シードリスト(mongodb+srv
)はまだサポートされていません。
:::note トラブルが発生した場合は、問題を報告し、従来の実装を試してみてください。ただし、これは非推奨であり、次のリリースで削除される予定ですのでご注意ください。 :::
テーブルの作成
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 接続文字列オプション(省略可能なパラメータ)。
:::tip
MongoDB Atlas クラウド提供の接続 URL は 'Atlas SQL' オプションから取得できます。シードリスト(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 |
その他 | String |
キーが MongoDB ドキュメントに存在しない場合(例えば、カラム名が一致しない場合)、デフォルト値または NULL
(カラムが nullable の場合)が挿入されます。
サポートされている句
単純な式のクエリのみがサポートされています(例:WHERE field = <constant> ORDER BY field2 LIMIT <constant>
)。こうした式は MongoDB クエリ言語に変換され、サーバー側で実行されます。
これらの制限をすべて無効にしたい場合は、mongodb_throw_on_unsupported_queryを使用してください。その場合、ClickHouse はベストエフォートでクエリを変換しようとしますが、フルテーブルスキャンや ClickHouse 側での処理につながる可能性があります。
:::note
リテラルの型を明示的に指定した方が良いです。これは 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 データセットがロードされていると仮定します。
MongoDB コレクションからデータを読み取れる ClickHouse でテーブルを作成します:
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 は MongoDB にはプッシュダウンできません
SET mongodb_throw_on_unsupported_query = 0;
-- 評価が 7.5 を超える 'Back to the Future' シリーズの続編を見つける
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
-- Cormac McCarthy の本に基づいたトップ3の映画を探す
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 クエリを見ることができます。