MongoDB 如何实现多字段 JOIN 运算
MongoDB是一个文档型、无模式的数据库,自然就很难在关系型数据库中非常擅长的多表关联上发挥作用。尽管后来版本 MongoDB 增加了 $lookup 支持单字段关联,但对两个或两个以上的字段关联的需求有点心有余而力不足。如有两个集合 C1、C2 通过 C1.sid=C2.sid and C1.mid=C2.mid 进行关联查询:
C1 | sid | mid | sale |
100 | 102 | 8210 | |
100 | 103 | 4932 |
C2 | sid | mid | buy |
100 | 102 | 4300 | |
100 | 103 | 5300 | |
100 | 104 | 7833 |
sid | mid | buy | sale |
100 | 102 | 8210 | 4300 |
100 | 103 | 4932 | 5300 |
用 MongoDB 脚本实现思路,可采用 \$lookup 函数将 C1,C2 两个集合关联查询返回嵌套结构,unwind 拆解嵌套结构成记录,通过 redact+cond+\$\$KEEP+\$\$PRUNE 组合进行过滤,最后显示需要的列,实现过程比较烦琐。
使用集算器, 可方便实现 C1.sid=C2.sid and C1.mid=C2.mid 关联查询,操作比较容易。集算器安装包可去 润乾网站 下载,运行时需要一个授权,免费版本就够用。
我们将上述描述事例实现步骤:
1. 在集算器中编写脚本cc.dfx:
A | B | |
1 | =mongo_open("mongodb://127.0.0.1:27017/raqdb") | / 连接 MongDB 数据库 |
2 | =mongo_shell(A1,"C1.find(, {_id: 0})").fetch() | / 获取集合 C1 数据 |
3 | =mongo_shell(A1,"C2.find(, {_id: 0})").fetch() | / 获取集合 C2 数据 |
4 | =A2.join(sid:mid, A3:sid:mid, buy) | / 进行关联查询,将字段 buy 追加到 A2 |
5 | >A1.close() | / 关闭数据库 |
A4 | sid | mid | buy | sale |
100 | 102 | 8210 | 4300 | |
100 | 103 | 4932 | 5300 |
A4:A2.join() 中前面 sid, mid 为 A2 字段,与 A3 中的两个对应。
集算器提供了 JDBC 接口,脚本 cc.dfx 很容易集成到 Java 中:
public static void doWork() {
Connection con = null;java.sql.Statement st;
try{
Class.forName("com.esproc.jdbc.InternalDriver");
con = DriverManager.getConnection("jdbc:esproc:local://");
// 调用脚本 cc.dfx
st=con.createStatement();
ResultSet rst = st.executeQuery("call cc");
System.out.println(rst);
} catch(Exception e){
System.out.println(e);
} finally{
// 关闭连接
if (con!= null) {
try {
con.close();
} catch(Exception e) {
System.out.println(e);
}
}
}
}
对于两个集合的多个字段关联,或多个集合进行关联查询,集算器都可以进行处理。
集算器与 JAVA 集成的进一步信息可参考:《Java 如何调用 SPL 脚本》。
英文版