我正在尝试汇总来自不同设备的一些信息。给定一组设备ID,我想计算值发生的次数。我正在努力的一点是我们只想在每个设备的最后一次报告中工作。
例如,4个设备在报告集中存储了数十万个报告。报告告诉我们是否存在networkDown事件(布尔值)。我想计算4个设备上次报告中networkDown为真或假的次数。
我正在使用mongoDB 2.4.4
报告看起来与此相似:
{
"_id":ObjectId("52571500fa1fc70437000001"),
"device_id" : ObjectId("51f14f9f9809c4404f00000a"),
"payload":{
"name":"Status",
"properties":{
"property":{
"deviceIdentifier":"My Device",
"networkDown":"false"
}
}
},
"updated_at":ISODate("2013-10-10T20:58:40.674Z"),
"created_at":ISODate("2013-10-10T20:58:40.674Z")
}
我可以对所有4台设备的所有记录执行此操作。说,
db.report.aggregate(
[
{ $match: { device_id:
{
$in:
[
ObjectId("51f14f9f9809c4404f00000a"),
ObjectId("523ab68a9809c4e490000059"),
ObjectId("522f37b89809c4e8cf000033"),
ObjectId("522f38019809c4ae070000d3")
]
}
}
},
{ $group: { _id: "$payload.properties.property.networkDown", total: { $sum: 1 } } }
])
{
"result" : [
{
"_id" : "true",
"total" : 2
},
{
"_id" : "false",
"total" : 278539
}
],
"ok" : 1
}
但是,如何将查询限制为仅适用于每个设备的上一个报告?
感谢您的期待!
答案 0 :(得分:0)
您将首先在{updated_at:1}
的基础上进行排序。然后按device_id进行分组,并使用 $ last 运算符仅采用最后一个networkDown字段,因为文档已排序。然后在networkDown属性上执行另一个组。我知道它有点复杂,但这是查询:
db.reports.aggregate(
[
{ $match: { device_id:
{
$in:
[
ObjectId("51f14f9f9809c4404f00000a"),
ObjectId("523ab68a9809c4e490000059"),
ObjectId("522f37b89809c4e8cf000033"),
ObjectId("522f38019809c4ae070000d3")
]
}
}
},
{$sort:{updated_at:1}},
{$group:
{_id:"$device_id",
networkDown:{$last:"$payload.properties.property.networkDown"}
}
},
{$group:{_id:"$networkDown",count:{$sum:1}}}
])
我没有正确地尝试过,但它应该有效。如果有任何问题,请告诉我