使用SQL訪問MongoDB
簡介
使用SQL訪問MongoDB有多種解決方案,就我所知的,除了今天要介紹的MongoDB Connector for BI
外,還有Studio 3T
,但后者只有在企業版中才提供,使用成本之高是可以想見的,而MongoDB Connector for BI
則是MongoDB官方推出的,使用也相當方便。
本文以macOS為例進行說明,使用其他系統的同學也可以參考。
MongoDB Connector for BI
的作用如下圖所示,它只是做為BI和MongoDB之間的一個代理,將MongoDB的數據轉換為關系型的,並不存儲數據。
MongoDB Connector for BI
一共有兩個核心組件
- mongodrdl
- mongosqld
其實就是兩個可執行文件。
mongodrdl
它可以連接MongoDB,並生成一個Document-Relational Definition Language (DRDL) 文件,以便將給定MongoDB集合中的數據轉換為關系型的。
mongosqld
作為守護進程運行,響應SQL請求,並將其轉換為MongoDB的請求,注意,在啟動mongosqld守護進程先,必須先執行mongodrdl生成相應的DRDL文件。
NOTE
本文基本上是官方文檔的一個解釋,英語好的同學可以直接參考原文:MongoDB Connector for BI
安裝
OpenSSL
使用brew安裝OpenSSL
brew update
brew install openssl
MongoDB
這個不用多說了,安裝社區版即可。
MongoDB Connector for BI
同樣去官方網站進行下載即可,可以免費使用。
配置
生成DRDL
格式如下
mongodrdl --host {your.mongohost.com} -d dbname [-c collname] -o schema.drdl
NOTE
如果MongoDB啟用了密碼,則在生成DRDL時,還需要加-u -p --authenticationDatabase
這些認證選項,才能生成DRDL。
啟動mongosqld
NOTE
對於有認證的MongoDB,需要首先執行以下操作:
- 在terminal中執行
mysql_config --plugindir
查看MySQL的插件所在目錄(mysql_config是MySQL安裝目錄中bin目錄下的一個可執行文件)。 - 下載C Authentication Plugin——mongosql_auth,進入下載頁面后選擇對應的操作系統進行下載。
- 將下載后的文件解壓縮,拷貝lib目錄下的
mongosql_auth.so
到MySQL的插件目錄中即可,我電腦上的目錄是/usr/local/mysql/lib/plugin
。
官方文檔給出的啟動方式如下
mongosqld install --config {pathToConfigFile}/mongosqld.conf
sudo service mongosql start
但在macOS下,使用service mongosqld start
的方式顯然是無法啟動的。
可以使用如下兩種方式啟動:
使用schema文件
使用mongodrdl生成的DRDL文件,可以直接啟動mongosqld
$ mongosqld --schema <drdl file>
使用config文件
config文件是一種YAML格式的文件,其他配置可以參考官方文檔,但schema
一定要指定!
如下是我的config文件,假設名稱為mongosqld.conf
schema:
path: "/Users/luogang/Dropbox/Development/mongodb/mongodb-bi-x86_64-osx-v2.2.0/bin/candidate.drdl"
使用如下命令啟動mongosqld
$ mongosqld --config mongosqld.conf
NOTE
這兩種方式啟動后,都會監聽3307端口,如果你在本機已經啟動了MySQL Server,有可能mongosqld無法啟動,因為它發現/tmp/mysql.sock
已經被使用,這時候可以停止本機的MySQL Server,或者為mongosqld指定新的unix socket(使用--unixSocketPrefix選項)或者不使用UNIX socket(--noUnixSocket選項),但是使用后兩種解決方法要注意,MySQL Client連接時,默認會連接/tmp/mysql.sock
,由此導致連接的仍然是MySQL Server,而不是mongosqld。
使用MySQL Client連接
向無認證的MongoDB連接
也就是說,要連接的MongoDB沒有設置密碼,直接連接即可。
$ mysql --protocol tcp --port 3307
向有認證的MongoDB連接
$ mysql '--user=admin?source=admin' --default-auth=mongosql_auth -p
輸入密碼即可連接成功。
NOTE
這一步輸入的用戶名--user
為MongoDB的用戶名,source=
指定認證數據庫,跟MySQL Server的用戶名密碼沒有一毛錢關系了。
下面這幅圖是Mongo Compass中的截圖
下面這幅是在MySQL Client中的截圖,可以看出,已經可以使用SQL進行查詢了。
NOTE
使用其他MySQL客戶端進行連接的同學,可以在連接頁面查看Advanced選項,我在MySQLWorkbench中可以成功連接,在Advanced選項卡中的Others欄填寫--user=admin?source=admin --default-auth=mongosql_auth
即可。
小結
歡迎大家掃描二維碼關注我的微信公眾號哦,方便在手機上進行閱讀。