使用SQL访问MongoDB
使用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即可。
小结
欢迎大家扫描二维码关注我的微信公众号哦,方便在手机上进行阅读。

使用SQL访问MongoDB的更多相关文章
- 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南
1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...
- mongodb3.6 (五)net 客户端访问mongodb设置超时时间踩过的“坑”
前言 在上一篇文章中,我们有提到net访问mongodb连接超时默认为30秒,这个时间在实际项目中肯定是太长的.而MongoClientSettings 也确是提供了超时属性,如下图: 可实际使用中, ...
- ABP框架用Dapper实现通过SQL访问数据库
ABP的框架(2) - 访问数据库 为了防止不提供原网址的转载,特在这里加上原文链接:http://www.cnblogs.com/skabyy/p/7517397.html 本篇我们实现数据库的 ...
- Python访问MongoDB,并且转换成Dataframe
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/7/13 11:10 # @Author : baoshan # @Site ...
- Java 调用 groovy 脚本文件,groovy 访问 MongoDB
groovy 访问 MongoDB 示例: shell.groovy package db import com.gmongo.GMongoClient import com.mongodb.Basi ...
- 使用spring boot访问mongodb数据库
一. spring boot中传参的方法 1.自动化配置 spring Boot 对于开发人员最大的好处在于可以对 Spring 应用进行自动配置.Spring Boot 会根据应用中声明的第三方依赖 ...
- 使用Go客户端访问MongoDB
1.安装MongoDB 1.1 到官网:www.mongodb.org/downloads下载windows最新版本,解压到目标目录下. 1.2 创建数据存储目录 mongodb需要一个数据文件夹来保 ...
- MongoDB最简单的入门教程之五-通过Restful API访问MongoDB
通过前面四篇的学习,我们已经在本地安装了一个MongoDB数据库,并且通过一个简单的Spring boot应用的单元测试,插入了几条记录到MongoDB中,并通过MongoDB Compass查看到了 ...
- 使用Spring访问Mongodb的方法大全——Spring Data MongoDB
1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...
随机推荐
- jquery live hover
$("table tr").live({ mouseenter: function() { //todo }, mouseleave: function() { //todo } ...
- html的dtd声明
其实DOCTYPE声明,因为很多时候团队里没有做规范应该用哪个,而且几种不同的编辑工具新建出的html页面标准也不同:这就可能一个jsp页面写了几百行甚至上千行了,然后发现某个样式必须要改DOCTYP ...
- UVA 12130 - Summits(BFS+贪心)
UVA 12130 - Summits 题目链接 题意:给定一个h * w的图,每一个位置有一个值.如今要求出这个图上的峰顶有多少个.峰顶是这样定义的.有一个d值,假设一个位置是峰顶.那么它不能走到不 ...
- php 静态成员(static)抽象类(abstract)和接口(interface)
首先看一下静态成员(static)和普通成员(public; protect; private)的区别: 静态成员是属于类的,普通成员是属于对象的: 例如: <?php header(" ...
- SAM4E单片机之旅——8、UART初步
通信还是比让LED灯闪烁实用得多的. 这次试试使用UART,实现开发版和PC间的通信.功能比较简单,就是把PC发向开发版的内容发送回去.这次主要介绍一下UART的配置,至于通信,则使用较为简单的不断查 ...
- EasyPusher手机直播推送是如何实现后台直播推送的
本文由EasyDarwin开源团队成员John提供:http://blog.csdn.net/jyt0551/article/details/52276062 EasyPusher Android是使 ...
- 原来浏览器原生支持JS Base64编码解码 outside of the Latin1 range
原来浏览器原生支持JS Base64编码解码 « 张鑫旭-鑫空间-鑫生活 https://www.zhangxinxu.com/wordpress/2018/08/js-base64-atob-bto ...
- Linux就该这么学--命令集合5(用户与组管理命令)
1.useradd命令用于创建新用户:(useradd [选项] 用户名) 附录: -d 指定用户的家目录 -D 展示默认值 -e 账号有效截止日期,格式:YYY-MM-DD -g 指定一个初始用户组 ...
- Windows10搭建FTP服务器
配置FTP服务器步骤: 第一步: 打开控制面板--->选择程序--->启动或关闭Windows功能--->勾选FTP服务器等.如下图: 第二步: 右键此电脑--->点击管理-- ...
- Objective-c继承与组合
Objective-C 继承 继承:是一种XXX是XXX的关系.例如:学生是人,所以学生与人就是继承的关系. #import <Foundation/Foundation.h> @inte ...