实现 MongoDB 连接运算
**【摘要】**
早期的 Mongodb 版本没有 $lookup 接口来实现连接运算,或使用 $lookup 来实现连接运算比较麻烦时,集算器 SPL 语言实现了对多个文档不同类型的连接运算,对 Mongodb 提供了便利的技术。若想了解更多,请前往乾学院:实现 MongoDB 连接运算!
多表关联查询在数据库应用中比较常见,对于早期的 Mongodb 版本(3.2 版本新增)还没有 $lookup 接口时,即没有直接提供连接运算,硬编码实现有一定难度;或使用 $lookup 来实现连接运算比较麻烦。这种情况下可以用集算器 SPL 语言来实现多个文档的内连接、左连接、全连接、子文档连接,下面用例子来说明。
文档categories和 rules 在逻辑上是主子关系,关联字段是 cat,需要进行左连接运算,取出 rules 的 title、regex、cat 字段,以及 categories 中相关的 path 字段。部分源数据如下:
categories | rules |
{ "_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" } |
集算器代码:
A | B | |
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 Anglais | W:\videos |
Titanic | ^.*Titanic.*$ | Films Anglais | W:\videos |
The Avengers | ^.*TheAvengers.*$ | Films Anglais | W:\videos |
someSEO | ^.*someSEO.*$ | SEO Anglais | |
agriculture | ^.*agriculture.*$ | Transaction Anglais | W:\Tran |
industry | ^.*industry.*$ | Transaction Anglais | W:\Tran |
需要指出的是,如果数据太大无法装入内存,可以用函数export将A4输出到文件。
A6:关闭MongoDB连接。
集算器 SPL 语言不仅支持Mongodb基本的连接运算,也支持更复杂的多表关联运算,可参考相关文章<<简化MongoDB关联运算>>。
英文版