`
datamachine
  • 浏览: 157267 次
社区版块
存档分类
最新评论

用MongoDB做子查询

    博客分类:
  • DB
阅读更多

   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 * from orders where orders.sellerid in (select eid from employee where employee.state=’ California’)。

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

  用esProc协助MongoDB实现这个子查询的的脚本如下:



 

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

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

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

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

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

  计算结果是:



 

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

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

  • 大小: 33.5 KB
  • 大小: 37.4 KB
0
2
分享到:
评论

相关推荐

    MongoDB高级查询

    MongoDB高级查询,许多有用的查询函数,相信大家会用得到的

    MongoDB电子考试系统

    详细说明:... 自主开发的基于MongoDB的电子考试系统软件,实现模拟考试,在线课堂考试,考试成绩查询,题库管理,用户信息管理等功能。界面美观,简洁,可提供源代码、设计文档以及使用说明。

    MongoDB基本操作指南

    图2 MongoDB支持嵌入子文档简单易用的查询方式:MongoDB中的查询让人很舒适,没有SQL难记的语法,直接使用JSON,相当的直观。对不同的开发语言,你可以使用它最基本的数组或散列格式进行查询。配合附加的operator,...

    基于MongoDB电子考试系统项目实践

    自主开发的基于MongoDB的电子考试系统软件,实现模拟考试,在线课堂考试,考试成绩查询,题库管理,用户信息管理等功能。界面美观,简洁, 可提供源代码、设计文档以及使用说明。 详细说明:...

    MongoDB_文档_查询

    查询文档2.MongoDB 与 RDBMS Where 语句比较3.MongoDB AND 条件4.MongoDB OR 条件5.AND 和 OR 联合使用 1.查询文档 语法 MongoDB 查询数据的语法格式如下: db.collection.find(query, projection) query :可选,...

    Redis/MongoDB 接口封装(C++)

    3. 利用组合模式和装饰模式的思想开发 MongoDB 数据库查询条件装饰器 将查询条件和数据库 MongodbModule 数据模型进行解耦合 4. 抽象出一套 MongoDB Module 结果集接口 通过模板和特化技术实现 string/int 等不同...

    SpringBoot整合MongoDB.docx

    SpringBoot可以非常方便地引入...本节分两部分,记录个人学习SpringBoot使用MongoDB数据库的一些知识。 第一部分是一个简单的springboot连接mongo的demo,测试查询功能。 第二部分是基于mongo实现的增删改查数据示例。

    mongodb实现同库联表查询方法示例

    前言 最近在工作中遇到一个问题,需要对mongodb数据库进行联表查询...populate是使用外键关联子表 例如现在有一张订单表结构(动态外键): var orderSchema = new mongoose.Schema({ uid: { type: String, require

    mongodb-tree-structure:在MongoDB中实现树结构

    它具有“父”,“子”和“祖先”字段,分别保存文档ID(由MongoDB提供)作为节点引用。 通常,您需要一个文档作为树结构的顶层节点(或“根”)。 除顶级节点外,每个节点都必须引用其他任何一个节点作为其父节点...

    sql-to-mongodb:将SQL表转换为MongoDB集合的Java工具

    sql到mongodb 将SQL表转换为MongoDB集合的Java工具 轻松将 MSSQL 表转换为 MongoDB。 从下载 SQL Server JDBC 驱动程序 将 SQLJDBC4.jar 文件放在同一文件夹中。 一次指定 TABLE NAME 和 NUMBER OF ROWS 进行导入...

    MongoDB如何对数组中的元素进行查询详解

    前言 MongoDB是文档型数据库,每个文档(doc)表示数据的一项记录。相比关系型DB的row只能使用简单的数据类型,doc能够使用复杂的数据类型:内嵌doc,数组。...MongoDB中根据数组子元素进行匹配,有两种方式。

    《10天掌握MongoDB》2012完整版.pdf[带书签]

    《10天掌握MongoDB》2012翻新完整版,大小 4.6 MB,NewSQL 中文社区系列课程。本版本带有 PDF 书签,方便读者朋友阅览。 目录: 第一天:认识MONGODB 从NOSQL说起 NOSQL数据库特点 NOSQL数据库类型 MONGODB简介 ...

    利用mongodb查询某坐标是否在规定多边形区域内的方法

    大家都知道MongoDB是一个基于分布式文件存储的数据库,并提供创建基于地理空间的索引的能力,本文将使用MongoDB 基于地理空间索引进行坐标所在区域的判断及使用。 1.使用百度拾取坐标工具,在地图上定义多边形的坐标...

    MongoDB查询技巧总结

    主要介绍了MongoDB查询技巧总结,例如AND、OR条件查询,子文档查询等,需要的朋友可以参考下

    Django与MongoDB数据库的连接器-python

    允许Django使用MongoDB作为数据库后端的驱动程序 djongo 唯一让您在不更改 Django ORM 的情况下将 Django 与 MongoDB 一起使用的连接器将 MongoDB 用作 Django ... 如果您的模型使用嵌套查询或子查询集,例如:inne

    meteor-search:MongoDB中的简单全文搜索(Meteor)

    如果您的系统上还没有“真实”安装 MongoDB,请使用HomeBrew安装它: brew updatebrew install mongodb如果您不使用 Mac... Linux: : 视窗? 哎哟... 使用 textSearchEnabled=true 启动 MongoDB 在终端/控

    MongoDB的学习--索引类型和属性

    其创建语句如下:下面的语句能够使用其索引查找到上面的数据:但再下面的这一条语句就查不到数据了,说明子文档的查找必须是精确匹配,包括子文档中的顺序:在多个键上建立的索引就是复合索引。例子:

    MongoDB 索引 和explain分析查询速度1

    一、索引基础1 二、唯一索引2 三、索引的一些参数3 一、索引基础 二、唯一索引 三、索引的一些参数 四、使用 explain 五、explain execut

    isodata的matlab代码博客-NotesMongoDB:笔记MongoDB

    isodata的matlab代码博客笔记MongoDB 介绍 MongoDB 不强制执行任何模式,因此文档不必在一个集合内使用相同的模式。 ...上面这个命令将mongod进程作为子进程启动并在后台运行。 要停止这个 mongoDB

    MongoDB学习笔记(六) MongoDB索引用法和效率分析

    MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致。由于集合中的键(字段)可以是普通数据类型,也可以是子文档。MongoDB可以在各种类型的键上创建索引。下面分别讲解...

Global site tag (gtag.js) - Google Analytics