实现 MongoDB 连接运算

来源:http://stackoverflow.com/questions/29396985/is-there-a-where-like-relation-function-when-using-pymongo

**【摘要】**
        早期的 Mongodb 版本没有 $lookup 接口来实现连接运算,或使用 $lookup 来实现连接运算比较麻烦时,集算器 SPL 语言实现了对多个文档不同类型的连接运算,对 Mongodb 提供了便利的技术。若想了解更多,请前往乾学院:实现 MongoDB 连接运算!

 

复制摘要

         多表关联查询在数据库应用中比较常见,对于早期的 Mongodb 版本(3.2 版本新增)还没有 $lookup 接口时,即没有直接提供连接运算,硬编码实现有一定难度;或使用 $lookup 来实现连接运算比较麻烦。这种情况下可以用集算器 SPL 语言来实现多个文档的内连接、左连接、全连接、子文档连接,下面用例子来说明。

         文档categories和 rules 在逻辑上是主子关系,关联字段是 cat,需要进行左连接运算,取出 categories 的 title、regex、cat 字段,以及 rules 中相关的 path 字段。部分源数据如下:

categoriesrules
{    "_id" : ObjectId("551d1c61a82a701368ec49ad"),
    "cat" : "Transaction Anglais",
    "path" : "W:\\Tran"}
{"_id" :   ObjectId("551d1c61a82a701368ec49ae"),
    "cat" : "Films Anglais",
    "path" : "W:\\videos"}
{"_id" :   ObjectId("551d1c7da82a701368ec49af"),
    "title" : "braveheart",
    "regex" : "^.*braveheart.*$",
    "cat" : "Films Anglais"}
{"_id" : ObjectId("551d1c7da82a701368ec49b0"),
    "title" : "Titanic",
    "regex" : "^.*Titanic.*$",
    "cat" : "Films Anglais"}
{"_id" :   ObjectId("551d1c7da82a701368ec49b1"),
    "title" : "The Avengers",
    "regex" : "^.*TheAvengers.*$",
    "cat" : "Films Anglais"}
{"_id" :   ObjectId("551d1c7da82a701368ec49b2"),
    "title" : "someSEO",
    "regex" : "^.*someSEO.*$",
    "cat" : "SEO Anglais"}
{"_id" :   ObjectId("551d1c7da82a701368ec49b3"),
    "title" : "agriculture",
    "regex" : "^.*agriculture.*$",
    "cat" : "Transaction Anglais"}
{"_id" :   ObjectId("551d1c7da82a701368ec49b4"),
    "title" : "industry",
    "regex" : "^.*industry.*$",
    "cat" : "Transaction Anglais"
  }

集算器代码:

 AB
1=mongo_open("mongodb://localhost:27017/local?user=test&password=test")
2=mongo_shell(A1,"categories.find({},{_id:0}).sort({cat:1})")=mongo_shell(A1,"rules.find(,{_id:0})")
3=joinx@1(B2,cat;A2,cat) 
4=A3.new(_1.title,_1.regex,_1.cat,_2.path) 
5=A4.fetch() 
6=mongo_close(A1) 

         A1:连接MongoDB,连接字格式为mongodb://ip:port/db?arg=value&…
         A2、B2:使用find函数从MongoDB中取数并排序,形成游标。其中A2是被连接的游标,需要按cat排序。
         A3:进行连接运算,关联字段是cat,joinx对游标进行连接,@1表示左连接。
         A4:从A3取出需要的字段,_1和_2依次表示连接中的每个游标。
         A5:取出游标数据,结果如下:

_1.title_1.regex_1.cat_2.path
braveheart^.*braveheart.*$Films AnglaisW:\videos
Titanic^.*Titanic.*$Films AnglaisW:\videos
The Avengers^.*TheAvengers.*$Films AnglaisW:\videos
someSEO^.*someSEO.*$SEO Anglais 
agriculture^.*agriculture.*$Transaction AnglaisW:\Tran
industry^.*industry.*$Transaction AnglaisW:\Tran

         需要指出的是,如果数据太大无法装入内存,可以用函数export将A4输出到文件。
         A6:关闭MongoDB连接。

         集算器 SPL 语言不仅支持Mongodb基本的连接运算,也支持更复杂的多表关联运算,可参考相关文章<<简化MongoDB关联运算>>。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值