MongoDB 怎样对多列嵌套结构做聚合
针对多列带有嵌套结构的数据进行聚合查询。
下面要统计每条记录的 income,output 的数量和。
_id | income | output |
1 | {"cpu":1000, "mem":500, "mouse":"100"} | {"cpu":1000, "mem":600 , "mouse":"120"} |
2 | {"cpu":2000, "mem":1000, "mouse":50, "mainboard:500 } |
{"cpu":1500, "mem":300 } |
ID | INCOME | OUTPUT |
1 | 1600.0 | 1720.0 |
2 | 3550.0 | 1800.0 |
由于统计的记录不需要按每个产品分类,因此可使用集算器,每行记录的值按序列求和处理即可。
集算器安装包可去润乾网站下载,运行时需要一个授权,免费版本就够用。
我们将上述事例实现步骤:
1. 在集算器中编写脚本computer.dfx:
A | B | |
1 | =mongo_open("mongodb://localhost:27017/cookie") | / 连接数据库 |
2 | =mongo_shell(A1,"computer.find()").fetch() | / 查询集合 computer |
3 | =A2.new(_id:ID,income.array().sum():INCOME,output.array().sum():OUTPUT) | / 将字段 income, output 下的记录值转换成序列后求和 |
4 | >mongo_close(A1) | / 关闭连接 |
A2 | _id | income | output |
1 | [1000,500,100] | [1000,500,120] | |
2 | [2000,1000,50,…] | [1500,300] |
A3 | ID | INCOME | OUTPUT |
1 | 1600.0 | 1720.0 | |
2 | 3550.0 | 1800.0 |
public static void doComputer() {
Connection con = null;
java.sql.Statement st;
try{
Class.forName("com.esproc.jdbc.InternalDriver");
con = DriverManager.getConnection("jdbc:esproc:local://");
// 调用脚本 computer.dfx
st=con.createStatement();
ResultSet rst = st.executeQuery("call computer");
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脚本》。
英文版