使用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,需要首先执行以下操作:

  1. 在terminal中执行mysql_config --plugindir查看MySQL的插件所在目录(mysql_config是MySQL安装目录中bin目录下的一个可执行文件)。
  2. 下载C Authentication Plugin——mongosql_auth,进入下载页面后选择对应的操作系统进行下载。
  3. 将下载后的文件解压缩,拷贝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的更多相关文章

  1. 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南

    1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...

  2. mongodb3.6 (五)net 客户端访问mongodb设置超时时间踩过的“坑”

    前言 在上一篇文章中,我们有提到net访问mongodb连接超时默认为30秒,这个时间在实际项目中肯定是太长的.而MongoClientSettings 也确是提供了超时属性,如下图: 可实际使用中, ...

  3. ABP框架用Dapper实现通过SQL访问数据库

    ABP的框架(2) - 访问数据库   为了防止不提供原网址的转载,特在这里加上原文链接:http://www.cnblogs.com/skabyy/p/7517397.html 本篇我们实现数据库的 ...

  4. Python访问MongoDB,并且转换成Dataframe

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/7/13 11:10 # @Author : baoshan # @Site ...

  5. Java 调用 groovy 脚本文件,groovy 访问 MongoDB

    groovy 访问 MongoDB 示例: shell.groovy package db import com.gmongo.GMongoClient import com.mongodb.Basi ...

  6. 使用spring boot访问mongodb数据库

    一. spring boot中传参的方法 1.自动化配置 spring Boot 对于开发人员最大的好处在于可以对 Spring 应用进行自动配置.Spring Boot 会根据应用中声明的第三方依赖 ...

  7. 使用Go客户端访问MongoDB

    1.安装MongoDB 1.1 到官网:www.mongodb.org/downloads下载windows最新版本,解压到目标目录下. 1.2 创建数据存储目录 mongodb需要一个数据文件夹来保 ...

  8. MongoDB最简单的入门教程之五-通过Restful API访问MongoDB

    通过前面四篇的学习,我们已经在本地安装了一个MongoDB数据库,并且通过一个简单的Spring boot应用的单元测试,插入了几条记录到MongoDB中,并通过MongoDB Compass查看到了 ...

  9. 使用Spring访问Mongodb的方法大全——Spring Data MongoDB

    1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...

随机推荐

  1. 【BZOJ1844/2210】Pku1379 Run Away 模拟退火

    [BZOJ1844/2210]Pku1379 Run Away 题意:矩形区域中有一堆点,求矩形中一个位置使得它到所有点的距离的最小值最大. 题解:模拟退火的裸题,再调调调调调参就行了~ #inclu ...

  2. java基础知识查漏 二

    一.java基本数据类型所占的内存大小 在Java中一共有8种基本数据类型,其中有4种整型,2种浮点类型,1种用于表示Unicode编码的字符 单元的字符类型和1种用于表示真值的boolean类型.( ...

  3. [Phoenix] 四、加盐表

    摘要: 在密码学中,加盐是指在散列之前将散列内容(例如:密码)的任意固定位置插入特定的字符串.这个在散列中加入字符串的方式称为“加盐”.其作用是让加盐后的散列结果和没有加盐的结果不相同,在不同的应用情 ...

  4. 动态绑定允许我们在程序运行的过程中动态给class加上功能,这在静态语言中很难实现

    https://www.liaoxuefeng.com/wiki/ # 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法, # 这就是动态语言的 ...

  5. Kotlin基本语法笔记之函数、变量的定义及null检测

    定义函数 fun sum(a: Int, b: Int): Int { return a + b } 该函数中两个参数的类型都是Int,返回类型是Int 也可以做如下简化 fun sum(a: Int ...

  6. hibernate属性配置

    数据库中一个字段的默认值设为0,当用hibernate插入数据时,没有对该字段进行操作,结果该字段居然不是0,而是空.后来google了一下,发现应该在.hbm.xml文件中添加一些参数定义(示例中的 ...

  7. PAT 天梯赛 L1-050. 倒数第N个字符串 【字符串】

    题目链接 https://www.patest.cn/contests/gplt/L1-050 思路 因为是求倒数 我们不如直接 倒过来看 令 zzz 为第一个字符串 我们可以理解为 十进制 转换为 ...

  8. Unity导包配置详解

    Player Settings is where you define various parameters (platform specific) for the final game that y ...

  9. KeyChain相关参数的说明

    #pragma mark- 密钥类型 //密钥类型键 //CFTypeRef kSecClass // //值 //CFTypeRef kSecClassGenericPassword         ...

  10. js程序开发-3

    <h1>Date()类型</h1> 获取日期和时间 getDate() 获取日 1-31 getDay () 获取星期 0-6 getMonth () 获取月 0-11 get ...