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() / 关闭数据库
  2.      执行脚本返回结果:
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 脚本》。