MongoDB不支持join,其官网上推荐的unity jdbc可以把数据取出来进行二次计算实现join运算,但收费版才有这个功能。其他免费的jdbc drive只能支持最基本的SQL语句,不支持join。如果用Java等编程语言将数据取出后实现join计算,也比较复杂。
用免费的集算器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的所有订单信息。其中orders数据量较大,不能一次装入内存。Employee数据量较小,Orders过滤之后的结果数据量也比较小。
查询条件表达式可以作为参数传递给esProc,如下图:
A1: 连接MongoDB数据库,ip和端口号是localhost:27017,数据库是test,用户名和密码都是test。
A2: 使用find函数从MongoDB中取数,形成游标。集合是orders,过滤条件是空,指定键_id不取出。esProc在find函数中采用了和mongdb的find语句一样的参数格式。esProc的游标支持分批读取和处理数据,可以避免数据量过大,内存出现溢出的情况。
A3: 取得employee中的数据。因为数据量不大,所以用fetch函数一次取出。
A4: 使用switch函数,将游标A2中SELLERID字段的值,转换为A3(employee)中的记录引用。
A5: 按照条件过滤。这里使用宏来实现动态解析表达式,其中的where就是传入参数。集算器将先计算${…}里的表达式,将计算结果作为宏字符串值替换${…}之后解释执行。这个例子中最终执行的是:=A4.select(SELLERID.STATE==”California”)。由于SELLERID已经转化为employee的对应记录的引用,所以可以直接写SELLERID.STATE。过滤之后的结果数据量较小,所以一次取出。如果结果数据量仍然比较大的话,可以分批取出,比如每次取出10000条:fetch(10000)。
A6:将过滤结果中的SELLERID重新切换为普通值。
A6的计算结果是:
过滤条件发生变化时不用改变程序,只需改变where参数即可。例如,条件变为:state等于California的订单,或者CLIENT等于PWQ的订单。Where的参数值可以写为:CLIENT==”PWQ”|| SELLERID.STATE==”California”。
esProc并不包含MongoDB的java驱动包。用esProc来访问MongoDB,必须提前将MongoDB的java驱动包(esProc要求2.12.2或以上版本的驱动,mongo-java-driver-2.12.2.jar)放到[esProc安装目录]\common\jdbc中。
esProc协助MongoDB计算的脚本很容易集成到java中,只要增加一行A7,写成result A6即可向java输出resultset形式的结果,具体的代码请参考esProc教程。同样,用java调用esProc访问MongoDB也必须将mongdb的java驱动包放到java程序的classpath中。
集算器下载地址:http://www.raqsoft.cn/?p=2643。
相关推荐
MongoDB的多表关联查询是数据库操作中的重要环节,尤其是在处理复杂数据关联时显得尤为重要。在NoSQL数据库中,由于缺乏传统SQL的JOIN操作,关联查询通常更为复杂。MongoDB引入了聚合框架,其中的$lookup操作符解决...
在这个“非关联数据库mongodb的demo”中,我们可以探索MongoDB的一些核心特性以及如何使用它来存储和查询数据。 MongoDB采用文档型的数据模型,其中数据以JSON(JavaScript Object Notation)格式的文档存储。这种...
在传统的关系型数据库中,多表关联查询是通过JOIN操作来实现的,而在MongoDB中,由于其非关系性的特性,没有直接的JOIN操作。但是,可以通过一些方式实现类似的功能,如引用和聚合操作。 在MongoDB中,多表关联查询...
总的来说,在Hive与MongoDB进行关联操作时,需要考虑数据类型转换、配置连接信息、处理日期时区问题,以及在创建表时注意指定外部表并正确设置表属性和存储处理器等关键配置。这些都是在数据迁移过程中需要注意的...
在处理复杂的查询需求时,尽管 MongoDB 是非关联数据库,但它提供了一种称为 `population` 的机制来实现关联表查询,允许用户在查询时连接不同的集合,类似于关系数据库中的JOIN操作。 Population 是一种在MongoDB...
Jenssegers/Laravel-MongoDB还提供了关联(Relationships)、软删除(Soft Deleting)、分页(Pagination)等特性,使你可以充分利用MongoDB的优势,同时保持Laravel的开发体验。 在实际项目中,可能还需要根据需求...
- **引用数据模型**:当关联数据过大或需要独立更新时,可以使用引用关系,类似于传统数据库的外键。 - **混合数据模型**:根据业务需求,灵活组合嵌入式和引用模型,平衡数据结构的复杂性和查询性能。 2. 集群与...
这使得在一个文档内可以保存关联数据,减少了对多表JOIN操作的需求。 2. **集合与文档**:在MongoDB中,数据被组织成集合(类似于关系数据库中的表),而集合由一系列文档组成。每个文档都是一个键值对的集合,这些...
通过以上设计,我们可以清晰地看到不同实体之间的关联关系,同时也体现了MongoDB在NoSQL数据库设计方面的灵活性和强大功能。 #### 五、总结 MongoDB作为一种NoSQL数据库,非常适合处理非结构化或半结构化的数据。...
由于MongoDB的文档模型的扁平化特性,处理多对多关系可能需要一些创新的方法,例如通过引用到单独的关联表或使用数组字段存储相关联的文档ID。 此外,书中还提到了多态子类设计模式(Polymorphic Subtypes),这是...
- **数据库关联**:允许文档之间建立关联,增强数据模型的表达能力。 #### 六、GridFS文件系统 GridFS是MongoDB提供的一种用于存储和检索文件的标准API。它将文件分割成多个小块存储,每个块作为一个单独的文档,...
这使得MongoDB能够轻松地存储和处理复杂的数据模型,如树状结构、图形数据或者关联数组。 2. **集合与数据库**:在MongoDB中,数据组织成数据库、集合和文档。数据库是MongoDB中的顶级逻辑单元,类似传统数据库的...
### MongoDB 3.2.4 说明文档知识点总结 #### 一、MongoDB简介 **1.1 文档型数据库** MongoDB 是一种基于分布式文件存储的开源文档型数据库系统,设计初衷是为了解决传统关系型数据库在处理大规模非结构化数据时...
但对大型关联数据,可以使用引用方式,不过这可能导致多次查询并缺乏跨表事务支持。 在设计 MongoDB 文档模式时,应优先考虑内嵌,尽可能地遵循对象模型。对于一对一、一对多关系,可以直接在一个文档内表示。当...
- JSON schema验证在MongoDB中不同于SQL的表结构验证,需要使用特定的方法来实现。 - 考虑到MongoDB是非关系型数据库,设计数据模型时,要避免过于复杂的关联关系,充分利用其文档结构的优势。 **总结** "Laravel...
6. **模型定义**:在Laravel中,你可以创建MongoDB模型,指定对应的集合名,并定义属性和关联关系。Eloquent的特性如填充、验证、关联查询等依然可以使用。 7. **查询构建器**:使用Jenssegers库提供的查询构建器,...
关系型数据库如MySQL依赖于严格的表结构和数据间的关系,而NoSQL数据库如MongoDB则使用更为灵活的数据模型,例如文档存储可以使用JSON或BSON(MongoDB的二进制形式)格式存储数据。NoSQL数据库通常更容易水平扩展,...