MongoDB 連接器

此連接器允許在 Presto 中使用 MongoDB 集合作為表格。

注意

支援 MongoDB 2.6+,雖然強烈建議使用 3.0 或更新版本。

設定

若要設定 MongoDB 連接器,請建立一個目錄屬性檔案 etc/catalog/mongodb.properties,其中包含以下內容,並視需要替換屬性

connector.name=mongodb
mongodb.seeds=host1,host:port

多個 MongoDB 叢集

您可以根據需要設定多個目錄,因此如果您有其他 MongoDB 叢集,只需在 etc/catalog 中新增另一個屬性檔案,並使用不同的名稱 (確保其結尾為 .properties)。例如,如果您將屬性檔案命名為 sales.properties,Presto 將使用設定的連接器建立一個名為 sales 的目錄。

組態屬性

以下組態屬性可用

屬性名稱

描述

mongodb.seeds

所有 mongod 伺服器的清單

mongodb.schema-collection

包含綱要資訊的集合

mongodb.credentials

認證清單

mongodb.min-connections-per-host

每個主機的連線集區的最小大小

mongodb.connections-per-host

每個主機的連線集區的最大大小

mongodb.max-wait-time

最大等待時間

mongodb.connection-timeout

Socket 連線逾時

mongodb.socket-timeout

Socket 逾時

mongodb.socket-keep-alive

是否在每個 Socket 上啟用保持連線

mongodb.ssl.enabled

對 mongod/mongos 的連線使用 TLS/SSL

mongodb.read-preference

讀取偏好

mongodb.write-concern

寫入關注

mongodb.required-replica-set

必要的複本集名稱

mongodb.cursor-batch-size

批次中要傳回的元素數

mongodb.seeds

以逗號分隔的 hostname[:port] 清單,其中包含同一個複本集中的所有 mongod 伺服器,或同一個分片叢集中的 mongos 伺服器清單。如果未指定連接埠,將使用連接埠 27017。

此屬性是必要的;沒有預設值,並且必須定義至少一個種子。

mongodb.schema-collection

由於 MongoDB 是文件資料庫,因此系統中沒有固定的綱要資訊。因此,每個 MongoDB 資料庫中的特殊集合應定義所有表格的綱要。有關詳細資訊,請參閱表格定義章節。

在啟動時,此連接器會嘗試猜測欄位的類型,但對於您的集合,這可能不正確。在這種情況下,您需要手動修改它。CREATE TABLECREATE TABLE AS SELECT 會為您建立一個條目。

此屬性是選用的;預設值為 _schema

mongodb.credentials

以逗號分隔的 username:password@collection 認證清單

此屬性是選用的;沒有預設值。

mongodb.min-connections-per-host

此 MongoClient 執行個體每個主機的最小連線數。這些連線在閒置時將保留在集區中,且集區將確保在一段時間內至少包含此最小數字。

此屬性是選用的;預設值為 0

mongodb.connections-per-host

此 MongoClient 執行個體每個主機允許的最大連線數。這些連線在閒置時將保留在集區中。一旦集區耗盡,任何需要連線的操作都將會被封鎖,等待可用的連線。

此屬性是選用的;預設值為 100

mongodb.max-wait-time

執行緒等待連線可用的最大等待時間 (以毫秒為單位)。值為 0 表示它不會等待。負值表示無限期等待連線可用。

此屬性是選用的;預設值為 120000

mongodb.connection-timeout

連線逾時時間 (以毫秒為單位)。值為 0 表示沒有逾時。它僅在建立新連線時使用。

此屬性是選用的;預設值為 10000

mongodb.socket-timeout

Socket 逾時時間 (以毫秒為單位)。它用於 I/O Socket 讀取和寫入作業。

此屬性是選用的;預設值為 0,表示沒有逾時。

mongodb.socket-keep-alive

此旗標控制 Socket 保持連線功能,該功能可透過防火牆保持連線。

此屬性是選用的;預設值為 false

mongodb.ssl.enabled

此旗標啟用與 MongoDB 伺服器的 SSL 連線。

此屬性是選用的;預設值為 false

mongodb.read-preference

用於查詢、Map-Reduce、彙總和計數的讀取偏好。可用的值為 PRIMARYPRIMARY_PREFERREDSECONDARYSECONDARY_PREFERREDNEAREST

此屬性是選用的;預設值為 PRIMARY

mongodb.write-concern

要使用的寫入關注 (write concern)。可用的值為 ACKNOWLEDGEDFSYNC_SAFEFSYNCEDJOURNAL_SAFEJOURNALEDMAJORITYNORMALREPLICA_ACKNOWLEDGEDREPLICAS_SAFEUNACKNOWLEDGED

這個屬性是選填的;預設值為 ACKNOWLEDGED

mongodb.required-replica-set

所需的副本集名稱。設定此選項後,MongoClient 實例將

  1. 以副本集模式連線,並根據給定的伺服器探索集合的所有成員

  2. 確保所有成員回報的集合名稱與所需的集合名稱相符。

  3. 如果 seed list 中的任何成員不屬於具有所需名稱的副本集,則拒絕服務任何請求。

此屬性是選用的;沒有預設值。

mongodb.cursor-batch-size

限制在一個批次中返回的元素數量。游標通常會提取一批結果物件並將其儲存在本機。如果 batchSize 為 0,則會使用驅動程式的預設值。如果 batchSize 為正數,則代表檢索的每個物件批次的大小。可以調整它以優化效能並限制資料傳輸。如果 batchSize 為負數,它將限制返回的物件數量,這些物件符合最大批次大小限制(通常為 4MB),並且游標將會關閉。例如,如果 batchSize 為 -10,則伺服器最多將返回 10 個文件以及盡可能多的文件(上限 4MB),然後關閉游標。

注意

請勿使用批次大小為 1

此屬性是選用的;預設值為 0

表格定義

MongoDB 在 mongodb.schema-collection 組態值指定的特殊集合上維護表格定義。

注意

外掛程式無法偵測到集合已刪除。您需要在 Mongo Shell 中使用 db.getCollection("_schema").remove( { table: deleted_table_name }) 刪除該項目。或使用 Presto 執行 DROP TABLE table_name 來刪除集合。

綱要集合包含表格的 MongoDB 文件。

{
    "table": ...,
    "fields": [
          { "name" : ...,
            "type" : "varchar|bigint|boolean|double|date|array(bigint)|...",
            "hidden" : false },
            ...
        ]
    }
}

欄位

必要

類型

描述

table

必要

字串

Presto 表格名稱

fields

必要

陣列

欄位定義的清單。每個欄位定義都會在 Presto 表格中建立一個新資料行。

每個欄位定義

{
    "name": ...,
    "type": ...,
    "hidden": ...
}

欄位

必要

類型

描述

name

必要

字串

Presto 表格中的資料行名稱。

type

必要

字串

資料行的 Presto 類型。

hidden

選填

布林值

將資料行從 DESCRIBE <table name>SELECT * 中隱藏。預設為 false

索引鍵或訊息的欄位描述沒有限制。

ObjectId

MongoDB 集合具有特殊欄位 _id。連接器會嘗試遵循此特殊欄位的相同規則,因此會有隱藏欄位 _id

CREATE TABLE IF NOT EXISTS orders (
    orderkey bigint,
    orderstatus varchar,
    totalprice double,
    orderdate date
);

INSERT INTO orders VALUES(1, 'bad', 50.0, current_date);
INSERT INTO orders VALUES(2, 'good', 100.0, current_date);
SELECT _id, * FROM orders;
                 _id                 | orderkey | orderstatus | totalprice | orderdate
-------------------------------------+----------+-------------+------------+------------
 55 b1 51 63 38 64 d6 43 8c 61 a9 ce |        1 | bad         |       50.0 | 2015-07-23
 55 b1 51 67 38 64 d6 43 8c 61 a9 cf |        2 | good        |      100.0 | 2015-07-23
(2 rows)
SELECT _id, * FROM orders WHERE _id = ObjectId('55b151633864d6438c61a9ce');
                 _id                 | orderkey | orderstatus | totalprice | orderdate
-------------------------------------+----------+-------------+------------+------------
 55 b1 51 63 38 64 d6 43 8c 61 a9 ce |        1 | bad         |       50.0 | 2015-07-23
(1 row)

注意

遺憾的是,沒有辦法以更精緻的方式表示 _id 欄位,例如 55b151633864d6438c61a9ce

SQL 支援

ALTER TABLE

連接器支援 ALTER TABLE RENAME TO 操作。不支援 ALTER TABLE 的其他用法。