MongoDB不支持join,其官网上推荐的unity jdbc可以把数据取出来进行二次计算实现join运算,但这些join、group、函数、表达式等高级功能都是收费版才有,而且即使是收费版本,对子查询、窗口函数等复杂SQL运算仍不支持。其他免费的jdbc drive就只能支持最基本的SQL语句了。

用免费的esProc配合MongoDB,可以实现上述结构化(半结构化)复杂计算。这里以join为例说明一下具体作法。

MongoDB中的文档orders保存了订单数据,employee保存了员工数据。如下:

MongoDB shell version: 2.6.4
    connecting to: test
    > db.orders.find();
    { “_id” : ObjectId(“5434f88dd00ab5276493e270″), “ORDERID” : 1, “CLIENT” : “UJRNP
    ”, “SELLERID” : 17, “AMOUNT” : 392, “ORDERDATE” : “2008/11/2 15:28″ }
    { “_id” : ObjectId(“5434f88dd00ab5276493e271″), “ORDERID” : 2, “CLIENT” : “SJCH”
    , “SELLERID” : 6, “AMOUNT” : 4802, “ORDERDATE” : “2008/11/9 15:28″ }
    { “_id” : ObjectId(“5434f88dd00ab5276493e272″), “ORDERID” : 3, “CLIENT” : “UJRNP
    ”, “SELLERID” : 16, “AMOUNT” : 13500, “ORDERDATE” : “2008/11/5 15:28″ }
    { “_id” : ObjectId(“5434f88dd00ab5276493e273″), “ORDERID” : 4, “CLIENT” : “PWQ”,
    ”SELLERID” : 9, “AMOUNT” : 26100, “ORDERDATE” : “2008/11/8 15:28″ }
    …
    > db.employee.find();
    { “_id” : ObjectId(“5437413513bdf2a4048f3480″), “EID” : 1, “NAME” : “Rebecca”, ”
    SURNAME” : “Moore”, “GENDER” : “F”, “STATE” : “California”, “BIRTHDAY” : “1974-1
    1-20″, “HIREDATE” : “2005-03-11″, “DEPT” : “R&D”, “SALARY” : 7000 }
    { “_id” : ObjectId(“5437413513bdf2a4048f3481″), “EID” : 2, “NAME” : “Ashley”, “S
    URNAME” : “Wilson”, “GENDER” : “F”, “STATE” : “New York”, “BIRTHDAY” : “1980-07-
    19″, “HIREDATE” : “2008-03-16″, “DEPT” : “Finance”, “SALARY” : 11000 }
    { “_id” : ObjectId(“5437413513bdf2a4048f3482″), “EID” : 3, “NAME” : “Rachel”, “S
    URNAME” : “Johnson”, “GENDER” : “F”, “STATE” : “New Mexico”, “BIRTHDAY” : “1970-
    12-17″, “HIREDATE” : “2010-12-01″, “DEPT” : “Sales”, “SALARY” : 9000 }
    …

Orders中的sellerid对应employee中的eid。需要查询出employee的state属性等于California的所有订单信息。查询条件表达式可以作为参数传递给esProc,如下图:

esProc并不包含MongoDB的java驱动包。用esProc来访问MongoDB,必须提前将MongoDB的java驱动包(esProc要求2.12.2或以上版本的驱动,mongo-java-driver-2.12.2.jar)放到[esProc安装目录]\common\jdbc中。Mongodb的java驱动包下载地址是:https://github.com/mongodb/mongo-java-driver/releases。

esProc的程序代码如下:

A1: 连接MongoDB数据库,ip和端口号是localhost:27017,数据库是test,用户名和密码都是test。如果需要其他参数的话可以按照mongo://ip:port/db?arg=value&…格式继续写参数。

A2: 使用find函数从MongoDB中取数,形成游标。集合是orders,过滤条件是空,指定键_id不取出。可以看出find函数和MongoDB的find函数类似。esProc的游标是分批读取和处理数据,可以避免数据量过大,内存出现溢出的情况。这里数据量不大,所以用fetch函数一次取出。

A3: 取得employee中的数据。

A4: 使用switch函数,将A2(orders)中SELLERID字段的值,转换为A3(employee)中的记录引用。

A5: 按照条件过滤。这里使用宏来实现动态解析表达式,其中的where就是传入参数。集算器将先计算${…}里的表达式,将计算结果作为宏字符串值替换${…}之后解释执行。这个例子中最终执行的是:=A2.select(SELLERID.STATE=”California”)。由于SELLERID已经转化为employee的对应记录的引用,所以可以直接写SELLERID.STATE。

A6:将过滤结果中的SELLERID重新切换为普通值。

A7:将符合条件的结果集返回给java。

过滤条件发生变化时不用改变程序,只需改变where参数即可。例如,条件变为:state等于California的订单,或者CLIENT等于PWQ的订单。Where的参数值可以写为:CLIENT==”PWQ”|| SELLERID.STATE==”California”。

在Java程序中使用esProc JDBC调用这段程序获得结果的代码如下:(将上述esProc程序保存为test.dfx,将MongoDB的java驱动包放到java程序的classpath中):

//建立esProc jdbc连接
    Class.forName(“com.esproc.jdbc.InternalDriver”);
    con= DriverManager.getConnection(“jdbc:esproc:local://”);
    //调用esProc程序(存储过程),其中test是dfx的文件名
    com.esproc.jdbc.InternalCStatement st =(com.esproc.jdbc.InternalCStatement)con.prepareCall(“call test(?)”);
    //设置参数
    st.setObject(1,” CLIENT==\”PWQ\” || SELLERID.STATE==e\”California\”");
    //执行esProc存储过程
    ResultSet set =st.executeQuery();

集算器协助java处理多样性数据源之MongoDB的更多相关文章

  1. java安全沙箱(四)之安全管理器及Java API

    java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于Java虚拟机(及语言)的安全特性 安全管理器及J ...

  2. js-计算器

    <div class="main"><h1>HTML5-计算器</h1>            <input id="num1& ...

  3. Spring JdbcTemplate 查询结果集Map反向生成Java实体(转)

    原文地址:Spring JdbcTemplate 查询结果集Map反向生成Java实体 以前写过一篇文章吐槽过Spring JdbcTemplate的queryForList方法(参见:http:// ...

  4. JVM类加载器及Java类的生命周期

    预定义类加载器(三种): 启动(Bootstrap)类加载器: 是用本地代码实现的类装入器,它负责将<Java_Runtime_Home>/lib下面的类库加载到内存中(比如rt.jar) ...

  5. 用JavaScript做一個簡單的計算器

    今天繼續學習JavaScript,視頻講的確實挺差勁的.還是只能跟著W3School自己慢慢摸索著弄了.自己百度了一下,參考了一個大佬寫的一個簡單的計算器代碼.代碼能跑通,但是做出來的樣子實在是感覺太 ...

  6. Python---Tkinter---计算器

    Python---Tkinter---计算器 - 模拟系统的计算器功能 - 实现一个简单的具有加减法等操作的计算器 - 使用tkinter - 操作步骤 - 画GUI - 给每个控件配置相应的事件 - ...

  7. 模拟安装redis5.0集群并通过Java代码访问redis集群

    在虚拟机上模拟redis5.0的集群,由于redis的投票机制,一个集群至少需要3个redis节点,如果每个节点设置一主一备,一共需要六台虚拟机来搭建集群,此处,在一台虚拟机上使用6个redis实例来 ...

  8. Bugku练习题---Web---计算器

    Bugku练习题---Web---计算器 flag:flag{8b4b2f83db2992d17d770be1db965147} 解题步骤: 1.观察题目,打开场景 2.场景打开后发现是一个验证码界面 ...

  9. MongoDB和Java(7):MongoDB用户管理

    最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...

随机推荐

  1. C#入门经典第五版之变量的更多内容编码题训练

    1. 编写一个控制台应用程序,它接收用户输入的一个字符串,将其中的字符以与输入相反的顺序输出. public string ReverseString(string str) { string rev ...

  2. 准备.Net转前端开发-WPF界面框架那些事,值得珍藏的8个问题

    题外话 不出意外,本片内容应该是最后一篇关于.Net技术的博客,做.Net的伙伴们忽喷忽喷..Net挺好的,微软最近在跨平台方面搞的水深火热,更新也比较频繁,而且博客园的很多大牛也写的有跨平台相关技术 ...

  3. YAML初探

    http://www.cnblogs.com/chwkai/archive/2009/03/01/249924.html 1 概念YAML是一种人们可以轻松阅读的数据序列化格式,并且它非常适合对动态编 ...

  4. jar包和war包的区别(转)

    jar包和war包的区别:war是一个web模块,其中需要包括WEB-INF,是可以直接运行的WEB模块.而jar一般只是包括一些class文件,在声明了Main_class之后是可以用java命令运 ...

  5. PHP redis Api 中文文档

    phpredis是php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系 很有用;以下是redis官方提供的命令使用技巧: 下载地址如下: https://github.com/ow ...

  6. rabbitmq学习笔记1 安装和配置

    环境 OS: CentOS Linux release 7.1.1503 (Core) kernel:3.10.0-229.el7.x86_64   安装 参考:http://www.rabbitmq ...

  7. 媲美oracle awr/statspack的mysql awr第一版发布

    现发布alpha版mysql awr,其提供的特性类似于oracle awr或statspack+集中式监控.对于原来从事oracle dba或者相关运维的人原来说,这会是个不错的选择. 至于我为什么 ...

  8. C# 循环语句 for循环

    循环:反复执行某段代码. 循环四要素:初始条件,循环条件,循环体,状态改变.for(初始条件;循环条件;状态改变){ 循环体} 给出初始条件,先判断是否满足循环条件,如果不满足条件则跳过for语句,如 ...

  9. 领域对象模型(domain object model)

    在Play程序中,模型(model)占据了核心地位.它是程序操作的信息的特定领域的表现方式. Martin Fowler这样定义模型: 负责表达业务概念,业务状态信息以及业务规则.尽管保存业务状态的技 ...

  10. jQuery eislideshow 图片轮播

    在线实例 基础演示 自动播放 使用方法 <div id="ei-slider" class="ei-slider"> <ul class=&q ...