实现MongoDB外键关联-创新互联

来源:http://stackoverflow.com/questions/29392169/populating-field-values-for-referred-documents-in-aggregate-call-in-mongoose  。

成都创新互联-专业网站定制、快速模板网站建设、高性价比临翔网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式临翔网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖临翔地区。费用合理售后完善,十余年实体公司更值得信赖。

【摘要】
        Mongodb 作为分布式文件存储的数据库,想实现多表关联 JOIN 查询并非易事。但通过集算器 SPL 语言,在 Mongodb 中多个表的外键关联查询,完全可以做到像关系数据库那样方便容易。

MongoDB 是一个分布式文件存储的数据库,也是 nosql 中最像关系型数据库的一种。但是 mongodb 采用文档模式设计的,这意味着集合中的文档可以有相同或不同的字段,因此在关系型数据库非常擅长的多表关联方面就显得差强人意。如果采用 Mongodb 本身的 API 则需要硬编码才能实现外键关联,不够直观且难度较大,这种情况下可以用集算器 SPL 语言来实现,下面用例子说明。

Collection UserCourseProgress 记录着用户和课程的关系,其courseid字段是外键,指向Collection Course的_id字段。需要统计出每门课的人数,其中课程名称需要使用Course的title字段进行显示。

UserCourseProgressCourse
{"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的代码如下:


A
1=mongo_open("mongodb://localhost:27017/local?user=test&password=test")
2=mongo_shell(A1,"UserCourseProgress.aggregate([{$group:   {_id: {'primary':'$courseid'},'popularityCount': {$sum: 1}}}, {$sort:{'popularityCount':-1}},{$project:{_id:0,'courseid':'$_id.primary','popularityCount':1}}])")
3=mongo_shell(A1,"Course.find(,{title:1})").fetch()
4=A2.switch(courseid,A3:_id)
5=A4.new(popularityCount,courseid.title)
6=mongo_close(A1)

A1: 连接MongoDB,连接字格式为mongo://ip:port/db?arg=value&…。

A2: 统计出每门课的人数。这里使用MongoDB聚合函数aggregate在UserCourseProgress中取数,参数是遵循mongodb规范的汇总表达式。计算结果是内存数据,如下:

实现 MongoDB 外键关联

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

实现 MongoDB 外键关联

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

实现 MongoDB 外键关联

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

实现 MongoDB 外键关联

A6:关闭mongodb连接。

通过上面的例子可以看到,借助集算器SPL语言,在Mongodb中多个表的外键关联查询,完全可以做到像关系数据库那样方便、容易、直观,不必担心因为Mongodb是非关系型数据库而带来的表间弱关联的影响。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前名称:实现MongoDB外键关联-创新互联
网页地址:http://ybzwz.com/article/cocpei.html