首页 > IT职业 > IT职场 > 实现 MongoDB 外键关联
【摘要】
Mongodb 作为分布式文件存储的数据库,想实现多表关联 JOIN 查询并非易事。但通过集算器 SPL 语言,在 Mongodb 中多个表的外键关联查询,完全可以做到像关系数据库那样方便容易。若想了解更多,请前往乾学院:
实现 MongoDB 外键关联!
MongoDB 是一个分布式文件存储的数据库,也是 nosql 中最像关系型数据库的一种。但是 mongodb 采用文档模式设计的,这意味着集合中的文档可以有相同或不同的字段,因此在关系型数据库非常擅长的多表关联方面就显得差强人意。如果采用 Mongodb 本身的 API 则需要硬编码才能实现外键关联,不够直观且难度较大,这种情况下可以用集算器 SPL 语言来实现,下面用例子说明。
Collection UserCourseProgress 记录着用户和课程的关系,其courseid字段是外键,指向Collection Course的_id字段。需要统计出每门课的人数,其中课程名称需要使用Course的title字段进行显示。
| UserCourseProgress | Course |
| {"userId":"u01",
"courseid":"c01", "timespent":6000, score:99} {"userId":"u02", "courseid":"c01", "timespent":6000, score:99} {"userId":"u03", "courseid":"c01", "timespent":6000, score:99} {"userId":"u04", "courseid":"c01", "timespent":6000, score:99} {"userId":"u05", "courseid":"c01", "timespent":6000, score:99} {"userId":"u01", "courseid":"c02", "timespent":6000, score:99} {"userId":"u02", "courseid":"c02", "timespent":6000, score:99} {"userId":"u03", "courseid":"c03", "timespent":6000, score:99} |
{"_id":"c01"
"title":"Japanese159", "description":"Japanese base", "category":"language"} {"_id":"c02" "title":"Chinese200", "description":"Chinese middle", "category":"language"} {"_id":"c03" "title":"Political science 280", "description":"Political middle", "category":"politics"} {"_id":"c04" "title":"EE490", "description":"electronic engineering hign", "category":"Electronic"} |
使用集算器SPL的代码如下:

A1: 连接MongoDB,连接字格式为mongo://ip:port/db?arg=value&…。
A2: 统计出每门课的人数。这里使用MongoDB聚合函数aggregate在UserCourseProgress中取数,参数是遵循mongodb规范的汇总表达式。计算结果是内存数据,如下:

A3: 用find函数从Course中取数,过滤条件为空。Find的结果是游标,由于课程数量较少,因此用可以fetch函数将游标读入内存,结果如下:

A4: 使用switch函数将A3中的外键切换为A2中的记录,结果如下:

A5:按对象方式访问内存,形成新的二维表,结果如下:

A6:关闭mongodb连接。
通过上面的例子可以看到,借助集算器SPL语言,在Mongodb中多个表的外键关联查询,完全可以做到像关系数据库那样方便、容易、直观,不必担心因为Mongodb是非关系型数据库而带来的表间弱关联的影响。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31543054/viewspace-2657823/ ,如需转载,请注明出处,否则将追究法律责任。