集算器协助MongoDB计算之子查询
admin
2023-04-12 04:43:05
0

MongoDB不支持子查询,碰到这些复杂的运算就只能先将数据读出后再计算,而用Java等语言编写这类计算也不是很简单,这时可以考虑用集算器esProc辅助实现。下面我们通过一个例子来看一下具体做法。

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

> 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 }

例子中的需求是查出订单信息,要求订单中的SELLERID必须是employee集合中STATE= California的员工id。如果写成sql就是:

Select * fromorders where orders.sellerid in (select eid from employee where employee.state=’California’)

Orders的数据量较大无法一次取出。employee的数据量较小,最终结果的数据量也较小。

用集算器esProc协助mongodb实现这个子查询的的脚本如下:

集算器协助MongoDB计算之子查询

  A1: 连接mongodb数据库,ip和端口号是localhost:27017,数据库是test,用户名和密码都是test

  A2: 使用find函数从mongodb中取数,形成游标。集合是orders,过滤条件是空,指定键_id不取出。esProcfind函数中采用了和mongdbfind语句一样的参数格式。esProc的游标是分批读取和处理数据,可以避免数据量过大,内存出现溢出的情况。

  A3: 取得employee中的数据,条件是STATE="California"

  A4: A3(employee)中的EID排序。

  A5: 按照条件过滤orders数据,条件是SELLERID必须在A4中,相当于SELLERIDin A4。一次性取出结果。如果结果较大,也可以分批取出,比如取出前1000行:fetch(1000)

计算结果是:

集算器协助MongoDB计算之子查询


需要说明的是:esProc并不包含mongodbjava驱动包。用esProc来访问mongodb,必须提前将mongodbjava驱动包(例如:mongo-java-driver-2.12.2.jar)放到[esProc安装目录]\common\jdbc中。

集算器esProc协助mongodb计算的脚本很容易集成到java中,只要增加一行,写成resultA6即可向java输出resultset形式的结果,具体的代码参考esProc教程。同样,用java调用esProc访问mongodb也必须将mongdbjava驱动包放到java程序的classpath中。




相关内容

热门资讯

重磅消息“新版荣耀牛牛怎么装挂... 您好:新版荣耀牛牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9752949】很多玩家在这款...
【第一消息】“开心游戏怎么开挂... 网上科普关于“开心游戏有没有挂”话题很是火热,小编也是针对开心游戏作*弊开挂的方法以及开挂对应的知识...
特朗普与泽连斯基会晤,回应年内... 美国东部时间28日下午,美国总统特朗普在佛罗里达州海湖庄园与乌克兰总统泽连斯基就拟议中的俄乌“和平计...
今日重大通报“天天微友炸/金/... 家人们!今天小编来为大家解答天天微友炸/金/花透视挂怎么安装这个问题咨询软件客服徽4282891的挂...
俄罗斯团体评年度热词 “拉布布... 新华社莫斯科12月28日电(记者栾海)临近岁末,俄罗斯多家团体评选出本国2025年度热词,“胜利”、...
我来教教您“白金岛歪胡子开挂器... 有 亲,根据资深记者爆料白金岛歪胡子是可以开挂的,确实有挂(咨询软件无需...
今日重磅消息“决战恩施麻将真的... 您好:决战恩施麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9784099】很多玩家在这款...
【今日要闻】“马鞍山麻将真的有... 您好:马鞍山麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【4282891】很多玩家在这款游...
玩家攻略科普“新好游牛牛是不是... 玩家攻略科普“新好游牛牛是不是有挂?”(其实是有挂)您好,新好游牛牛这个游戏其实有挂的,确实是有挂的...
重磅消息“十胡卡辅助器?”(太... 家人们!今天小编来为大家解答十胡卡透视挂怎么安装这个问题咨询软件客服徽4282891的挂在哪里买很多...