我收到了来自VirusTotal的一堆报告,并对自己说:“为了创建我需要的统计数据,为什么不将数据放入MongoDB并简单地查询它。不能太难,现在,可以吗?”
好吧,它可以。这是基本数据格式。
我最感兴趣的是scans
阵列。不幸的是,扫描仪名称是一个对象的关键,因为我甚至不是MongoDB新手,我不知道如何处理它。天哪,我甚至不知道如何搜索谷歌。
我想做什么:
detected:true
(和false
),按扫描仪名称分组。例如像这样(对于true
搜索):
Bkav: 20000
TotalDefense: 19238
BitDefender: 39132
...
result
领域。它包含恶意软件的名称,我想创建一个统计信息,有多少扫描程序对特定文件和整个集合使用相同的恶意软件系列名称。我真的很感激一些例子或指针。我即将编写一个小的python脚本来扫描所有的JSON文件,并做我需要的而不是使用MongoDB。
要从对象到数组,您可以使用$objectToArray
(Mongo 3.6和更新):
db.getCollection('collection').aggregate([
{$project: {scans: {$objectToArray: '$scans'}}}, // object -> array
{$unwind: '$scans'}, // array -> multiple docs
{$match: {'scans.v.detected': true /*or false*/}}, // filter
{$group: {_id: '$scans.k', count: {$sum: 1}}} // group
])
它会导致这样的事情:
[{
"_id" : "TotalDefense",
"count" : 1.0
},
{
"_id" : "Bkav",
"count" : 3.0
}]
至于第二个问题:$group
也适用于对象,所以你可以通过{scanner: '$scans.k', result: '$scans.v.result'}
分组。