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
用 MongoDB 脚本实现思路,由于是多列数据,需要在 aggregate 下用 project+filter+cond 方式 将 income,output 字段信息存放到数组中,用 unwind 拆解成记录,再累计各项值求和,按 _id 分组合并数据,实现过程比较麻烦。

由于统计的记录不需要按每个产品分类,因此可使用集算器,每行记录的值按序列求和处理即可。
集算器安装包可去润乾网站下载,运行时需要一个授权,免费版本就够用。

我们将上述事例实现步骤:
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) / 关闭连接
2.调试执行一下,可看到 A2 格值为:
A2  _id income output

1 [1000,500,100] [1000,500,120]
2 [2000,1000,50,…] [1500,300]
3.       执行脚本返回结果,
A3 ID INCOME OUTPUT

1 1600.0 1720.0
2 3550.0 1800.0

集算器提供了 JDBC 接口,脚本 computer.dfx 很容易集成到 Java 中:

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脚本》。