MongoDB テーブルエンジン
MongoDB エンジンは、リモートの MongoDB コレクションからデータを読み取るための、読み取り専用のテーブルエンジンです。
MongoDB v3.6 以降のサーバーのみがサポートされています。
シードリスト(mongodb+srv) は現在サポートされていません。
テーブルを作成する
エンジンパラメータ
| Parameter | Description |
|---|---|
host:port | MongoDB サーバーのアドレス。 |
database | リモートデータベース名。 |
collection | リモートコレクション名。 |
user | MongoDB ユーザー。 |
password | ユーザーのパスワード。 |
options | オプション。URL 形式の文字列として指定する MongoDB 接続文字列の options。例: 'authSource=admin&ssl=true' |
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 | Decimals を除く任意の数値型、Boolean、String |
| double | Float64、String |
| date | Date、Date32、DateTime、DateTime64、String |
| string | String、正しくフォーマットされていれば任意の数値型 (Decimals を除く) |
| document | String(JSON として) |
| array | Array、String(JSON として) |
| oid | String |
| binary | カラム内では String、配列または document 内では base64 エンコードされた文字列 |
| uuid (binary subtype 4) | UUID |
| その他すべて | String |
キーが MongoDB ドキュメント内に存在しない場合 (たとえばカラム名が一致しない場合)、デフォルト値または (カラムが Nullable の場合は) NULL が挿入されます。
OID
WHERE 句で String を oid として扱いたい場合は、テーブルエンジンの最後の引数にそのカラム名を指定します。
これは、MongoDB でデフォルトで oid 型を持つ _id カラムでレコードをクエリする際に必要になる場合があります。
テーブル内の _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 側での処理が発生する可能性があります。
MongoDB では厳密な型付きフィルタが必要となるため、リテラルの型を明示的に設定することを常に推奨します。
例えば、Date 型でフィルタリングしたい場合:
これは、Mongo が文字列を Date にキャストしないため動作しません。そのため、手動でキャストする必要があります。
これは Date、Date32、DateTime、Bool、UUID の各型に適用されます。
使用例
MongoDB に sample_mflix データセットが読み込まれていることを前提とします
MongoDB コレクション内のデータを読み取るための ClickHouse テーブルを作成します:
クエリ:
トラブルシューティング
DEBUG レベルのログで生成された MongoDB クエリを確認できます。