对 mongo 中的多层数据进行分类统计

例题描述和简单分析

MongoDB中有集合 devicestatus,如下:

{

        "_id" : "0001",

        "className" : "store",

        "deviceStatus" : [

                {

                        "deviceName" : "CardReader",

                        "errorCode" : "97080301",

                        "status" : "Bad"

                },

                {

                        "deviceName" : "CashAcceptor",

                        "errorCode" : "97080302,97080303",

                        "status" : "Bad"

                },

                {

                        "deviceName" : "CashDispenser",

                        "errorCode" : "",

                        "status" : "Good"

                }

        ]

}

需要将多层数据进行分类统计,结果如下:

className

deviceName

errorCode

status

store

CardReader

97080301

Bad

store

CashAcceptor

97080302,97080303

Bad

store

CashDispenser


Good

解法及简要说明

在集算器中编写脚本 p1.dfx,如下所示:


A

1

=mongo_open("mongodb://127.0.0.1:27017/raqsoft")

2

=mongo_shell@x(A1,"devicestatus.find()").fetch()

3

=A2.news(deviceStatus;className,~.deviceName,~.errorCode,~.status)

简要说明:

A1  通过 IP: 127.0.0.1,端口 27017,连接 mongodb server 的数据库 raqsoft,无用户名和密码。

A2  查询数据库,返回结果值,@x:执行完毕后自动关闭连接。

A3  循环 A2 每行,deviceStatus 中的每行数据转变成一个新行,新行由 4 列组成:第 1 列是 className, 后三列分别是 deviceName, errorCode 和 status , ~ 表示 deviceStatus 中的当前行数据。

BIRT集成这段代码的方法可参考:《BIRT如何调用 SPL 脚本》

问答搜集

https://stackoverflow.com/questions/47752325/creating-group-and-analyzing-data-from-array-list-in-birt