MongoDB 怎么实现行列转换
因业务需求,在 MongoDB 使用中需要处理行列转换。如有集合 scores, 记录了学生English、Math、PE三科成绩,需将 English、Math、PE 各科成绩分别作为列值显示。
| CLASS | STUDENTID | SUBJECT | SCORE |
| Class one | 1 | English | 84 |
| Class one | 1 | Math | 77 |
| Class one | 1 | PE | 69 |
| Class one | 2 | English | 81 |
| Class one | 2 | Math | 80 |
| … |
| CLASS | STUDENTID | English | Math | PE |
| Class one | 1 | 84 | 77 | 69 |
| … | … | |||
| … | … |
由于 MongoDB 没有提供相应的 api,实现按分组方式处理,但操作起来比较麻烦。
可以使用集算器, 用 pivot 函数实现比较容易。
集算器安装包可去润乾网站下载,运行时需要一个授权,免费版本就够用。
我们将上述事例实现步骤:
1、在集算器中编写脚本 scores.dfx:
| A | B | |
| 1 | =mongo_open("mongodb://127.0.0.1:27017/raqdb") | / 连接 MongDB 数据库 |
| 2 | =mongo_shell(A1,"scores.find(,{_id:0})") | / 获取集合 scores 数据 |
| 3 | =A2.pivot(CLASS,STUDENTID;SUBJECT,SCORE) | / 将成绩实现行转换成列 |
| 4 | =A3.pivot@r(CLASS,STUDENTID;SUBJECT,SCORE) | / 将成绩实现列转换成行 |
| 5 | >A1.close() | / 关闭连接 |
| A3 | CLASS | STUDENTID | English | Math | PE |
| Class one | 1 | 84 | 77 | 69 | |
| Class one | 2 | 81 | 80 | 97 | |
| Class one | 3 | 75 | 86 | 67 | |
| … |
| A4 | CLASS | STUDENTID | SUBJECT | SCORE |
| Class one | 1 | English | 84 | |
| Class one | 1 | Math | 77 | |
| Class one | 1 | PE | 69 | |
| Class one | 2 | English | 81 | |
| Class one | 2 | Math | 80 | |
| … |
pivot()函数按给定的 CLASS, STUDENTID 字段分组,将 SUBJECT 中的值作为列字段,SCORE 根据新列字段进行对应输出,即实现行转换成列,pivot@r()则实现列转换成行。
集算器提供了 JDBC 接口,脚本 scores.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://");
// 调用脚本 scores.dfx
st=con.createStatement();
ResultSet rst = st.executeQuery("call scores");
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 脚本》。

英文版