页面树结构
转至元数据结尾
转至元数据起始



1   概述

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

有关 MongoDB 的介绍和使用方法可以参阅MongoDB官方帮助文档的说明。


本文介绍如何在Smartbi中连接 MongoDB 数据库。版本信息如下

驱动版本Smartbi版本
mongo-java-driver-3.4.2Smartbi V11

Smartbi支持的MongoDB数据类型如下:

数据类型说明备注
INTEGER整数固定格式的简单结构,且子元素结构必须相同
decimal精确值类型
Double双精度浮点型
Date(TIMESTAMP)日期
String(VARCHAR)字符串
Boolean布尔型
json轻量级的数据交换格式
Array数组
不支持其它对象Object和正则表达等数据类型。

2  数据连接

2.1 配置信息

驱动程序类连接字符串驱动程序存放目录支持数据库版本

smartbi.jdbc.MongoDriver

jdbc:smartbi:mongo:<server>:<port>/<dbName>

自定义MongoDB 3.4.10

1)连接字符串主要信息说明:

  • <servername>:数据库的地址;
  • <port>:数据库端口;
  • <dbName>:数据库名称;

以上信息一般向数据库管理员获取。


2)添加自定义驱动方法:

a、首先进入到<Smartbi_PATH>\Tomcat\bin\dynamicLibraryPath文件夹下,手动添加mongodb文件夹。

b、然后进入mongodb文件夹下,添加mongodb驱动(驱动包可以从数据库官网获取或向数据库管理员获取)。

说明

除了常规的MongoDB数据库驱动外还需要额外的两个文件:

1、配置文件,必须是properties类型,文件名不限。内容为:useParentClassLoader=true。

2、将 MongoDB 数据库连接 Smartbi 产品的接口包复制到 MongoDB 驱动目录下:
   - 找到 `smartbi\WEB-INF\dbdriven` 目录下的 `Smartbi-Mongodb.Implement.jar` 文件(文件名也可能是 `smartbi-Mongodb.jar`)。
   - 将该文件复制到 MongoDB 驱动目录下。
   - 同时,将 `Smartbi-SmartbiCommon.jar` 文件也复制到 MongoDB 驱动目录下。

c、最后在数据连接时需要点击自定义选项,选择mongodb。

2.2 连接步骤

1)登录Smartbi企业报表分析平台,选择 数据连接>NoSQL数据库 ,点击 MongoDB 图标进入数据库连接界面。如下图所示:

2)根据配置信息,输入数据库对应的信息。如下图所示:

说明:

a、名称是数据连接名称,用户可以自定义,不可为空。

b、用户名和密码是连接字符串中配置的数据库的连接用户名和密码,可为空,一般可以联系数据库管理员获取。

① 如果使用MongoDB作为业务库时,需要在连接字符串后加上“?authenticationDatabase=test

例如:jdbc:smartbi:mongo:10.10.204.155:27017/test?authenticationDatabase=test

② 如果使用MongoDB作为认证库时,需要在连接字符串后加上“?authenticationDatabase=admin

例如:jdbc:smartbi:mongo:10.10.204.155:27017/test?authenticationDatabase=admin

2.3 测试连接

1)信息正确输入后,点击 测试连接 ,若出现如下图的 测试通过 弹出框,则表示可以成功连接上数据库。如下图所示:

2)测试连接成功后,点击右下角的 保存 按钮,选择数据源的保存位置,保存成功后,该数据连接即添加成功。如下图所示:

3)数据库连接成功后,可以参考快速入门使用方式查看数据。

2.4 使用说明及常见问题

MongoDB数据源为NOSQL数据库,仅支持创建原生SQL数据集、抽取模式下数据模型的SQL查询

数据集处理需通过antlr等第三方工具包统一解析sql语句的语法树,因为mongo不是使用sql语法,目前产品只能解析处理部分常用的MongoDB查询指令,其他指令需要在find之前前面加上return ,通过eval指令执行runCommand脚本函数支持。

使用时需注意如下:

1)目前直接支持的指令关键字有:(即find命令如果只使用了下面关键字不需要在前面加return )

常规指令:

find、getCollection、limit、sort、projection、skip、toArray等;

查询条件:

$gt、$gte、$lt、$lte、$eq、$neq、$in、$nin、$and、$or、$nor、$not、$regex等;

正则表达式部分字符(如字符^)与expression.antlr冲突,find查询支持直接使用正则表达式和使用new RegExp对象,但是不能包含冲突字符。如果是比较复杂的正则表达式建议添加return使用脚本查询。


2)目前支持的数据类型

 数值、字符、布尔、日期、正则、内嵌文档、常规数组;

产品默认只支持MongoDB规整结构的数据结构,即要求返回每行的数据结构是一样,每行不一样只解析第一行的数据结构,结果可能会存在列字段数据缺失,V11及以上最新版本可通过参数配置获取行数最大值来规避支持。


3)非单行指令,如需要设定变量等操作,都需要在查找数据的find指令之前添加return 使用脚本查询,再有执行权限的前提下,产品都能正常执行;

执行复杂场景的mongodb数据源指令,需要引用mongo数据库的客户端完成执行脚本命令,可以参考:Windows/Linux/docker环境部署的smartbi如何连接mongodb 相关章节进行配置。


4)]}、{[等特殊字符的组合antlr第三方工具包无法正常解析,需要通过在中括号和大括号之间添加换行,进行格式化规避处理;

如直接执行db.test.find({"name":{$in:["ttt"]}}),会报错:

添加换行后即正常:

db.test.find(
{"name":{
$in:["ttt"]
}}).toArray()

5)如果MongoDB开通了auth认证鉴权,使用return关键字执行脚本查询,MongoDB业务库配置的用户可能需要开通执行eval指令的权限(主要是针对mongo4及以前的较低版本),如需要anyAction或anyResource的权限,没有执行eval指令的权限可能会提示报错,如下图所示

开通权限命令:
db.createRole({role:"executeFunctions",privileges:[{resource:

{anyResource:true},

actions:["anyAction"]}],roles:[]})
db.grantRolesToUser("yourusername", [

{ role: "executeFunctions", db: "admin" }

])

6)目前产品处理MongoDB数据库自动生成的字段_id(随机UUID)默认是作为无意义字段,自动过滤字段_id忽略处理,如需支持,在url加个参数,&showIdColumn=true

7)MongoDB使用参数,参数类型建议设置为其他,按照MongoDB官方标准指令构建,方可正常使用


其它连接方案:

如果项目不考虑赋予该权限或者对mongo查询性能要求较高,可以使用presto对接mongodb的跨库方案,使用和执行的效率较好。

此方案使用步骤:

1、安装部署好Presto(可以使用产品提供的跨库介质,或者自行安装Presto),

2、手动在Presto中配置好mongodb的连接(连接方式可参考Presto官网),

3、最后在产品中创建Presto数据源连接。

4、通过 Presto数据源 创建数据模型,查询数据


  • 无标签