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中。
相关推荐
### MongoDB高级查询知识点详解 #### 一、基本概念回顾 MongoDB 是一款非常流行的文档型数据库,它使用 JSON 格式的文档存储数据。对于开发者来说,掌握 MongoDB 的查询技巧至关重要,尤其是在处理复杂查询需求时。...
MongoDB 的启动可以通过命令行方式启动,使用可执行文件 mongod,mongod 有很多的启动选项,例如: * --dbpath:指定数据目录,缺省为/data/db/。 * --port:指定服务器侦听的端口号,缺省使用 27017 端口。 * --...
详细说明:... 自主开发的基于MongoDB的电子考试系统软件,实现模拟考试,在线课堂考试,考试成绩查询,题库管理,用户信息管理等功能。界面美观,简洁,可提供源代码、设计文档以及使用说明。
MongoDB 覆盖索引查询是一种优化查询性能的技术,尤其适用于需要高效检索和返回大量数据的场景。在MongoDB中,覆盖索引查询是指查询涉及的所有字段都包含在创建的索引中,这样MongoDB就无需回表(即不需访问原始文档...
自主开发的基于MongoDB的电子考试系统软件,实现模拟考试,在线课堂考试,考试成绩查询,题库管理,用户信息管理等功能。界面美观,简洁, 可提供源代码、设计文档以及使用说明。 详细说明:...
使用“mongod.exe” --install命令,然后用“net start MongoDB”启动服务。 8. 安全性:默认情况下,MongoDB不开启任何安全措施。为了生产环境的安全,你应该设置访问控制,如添加用户、启用身份验证以及配置网络...
在使用MongoDB时,你可以利用官方提供的MongoDB Compass工具,它是一个图形用户界面,方便你可视化数据、运行查询、管理数据库和监控性能。 总的来说,MongoDB是一款强大的数据库系统,尤其适合需要快速迭代和处理...
- **Spring Data MongoDB** 支持定义 Repository 接口来进行数据访问,这些接口通常继承自 `MongoRepository` 或其子接口。 - **Repository** 可以定义基于方法名的查询方法,例如: ```java public interface ...
MongoDB的查询语法简单直观,基于JSON,易于理解和使用。它支持多种查询操作,如范围查询、正则表达式查询和对子文档属性的查询。此外,MongoDB还提供了更新操作符,可以实现在服务器端的即时更新,减少客户端和...
MongoDB的数据存储在"data"目录下的"db"子目录中,但安装过程中不会自动创建这些目录。用户需要手动创建"data"目录,并在其中创建"db"目录,通常推荐的路径是"/data/db",这是MongoDB默认的数据库路径。如果希望使用...
MongoDB之查询 MongoDB是一种基于NoSQL的数据库,查询操作是数据库的核心操作。MongoDB对查询的支持非常到位,包含有关系运算、逻辑运算、数组运算、正则运算等等。 ### find简介 在MongoDB中,find函数是查询的...
5. 强大的查询语言:MongoDB具备非常强大的查询语言,能够执行复杂的查询操作,包括文本搜索、地理空间查询等。 6. JavaScript支持:由于使用了JavaScript风格的查询语句,可以直接利用JavaScript编写应用逻辑,与...
1. **性能提升**:MongoDB 3.0系列对查询性能进行了优化,包括更快的索引构建和查询执行,以及内存管理的改进,使得数据处理速度显著提升。 2. **WiredTiger存储引擎**:MongoDB 3.0开始支持WiredTiger作为默认存储...
5. **查询语言**:MongoDB使用强大的查询语言,支持丰富的查询条件,包括字段匹配、范围查询、正则表达式等。 6. **聚合框架**:MongoDB的聚合框架允许开发者对数据进行处理,如计算统计信息、分组数据、转换数据...
3. 高性能:MongoDB支持索引、查询优化和内存映射文件,能快速处理大量读写操作。在32位系统上,虽然内存限制可能会影响性能,但通过合理配置和数据管理,仍然可以实现高效运行。 4. 高可用性:MongoDB支持复制集,...
3. 创建MongoDB Repository:创建一个接口,继承`MongoRepository`或其子接口,定义查询方法。 4. 实体类:定义与MongoDB集合对应的Java类,使用`@Document`注解标记。 5. 使用Repository:在需要操作数据库的...
这样,当执行以下查询时,MongoDB可以使用覆盖索引: ```shell db.users.find({gender: "M"}, {user_name: 1, _id: 0}) ``` 在这个例子中,我们明确指定了返回`user_name`字段,并排除了`_id`字段。因为`_id`默认...
开发者会学习到如何使用Java驱动程序连接MongoDB服务器,执行CRUD(Create, Read, Update, Delete)操作,理解文档、集合和数据库之间的关系,以及掌握基本的查询语法,如字段筛选、条件查询和投影。 其次,"micai-...
Spring Data MongoDB是Spring Data子项目的一部分,它为MongoDB提供了一种声明式的数据访问方式。这个项目的目标是简化MongoDB与Java应用的集成,通过提供一套高级API,使得开发人员能够更便捷地操作MongoDB。 在...
综上所述,Spring Data MongoDB提供了一种简洁的方式,通过`MongoTemplate`来处理MongoDB数据库的各种操作,包括查询、更新、插入等。`@Document`注解帮助映射Java对象到MongoDB集合,而`MongoTemplate`提供了丰富的...