对 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 脚本》。
英文版