MongoDB对象数组,按简单条件计数,按对象键分组

MongoDB对象数组,按简单条件计数,按对象键分组,mongodb,Mongodb,我有一大堆来自VirusTotal的报告,我想:“为了创建我需要的统计数据,为什么不把数据放到MongoDB中,然后简单地查询它。现在这不会太难吧?” 嗯,它可以。这是基本的数据格式 我最感兴趣的是扫描数组。不幸的是,扫描器名称是一个对象的键,因为我根本不是MongoDB新手,所以我不知道如何处理这个问题。见鬼,我甚至不知道如何在谷歌上搜索 我想做的是: 获取检测到的扫描仪数量计数:true(和false),按扫描仪名称分组。例如,类似这样的内容(对于true搜索): 另一个有趣的位涉及结

我有一大堆来自VirusTotal的报告,我想:“为了创建我需要的统计数据,为什么不把数据放到MongoDB中,然后简单地查询它。现在这不会太难吧?”

嗯,它可以。这是基本的数据格式

我最感兴趣的是
扫描
数组。不幸的是,扫描器名称是一个对象的键,因为我根本不是MongoDB新手,所以我不知道如何处理这个问题。见鬼,我甚至不知道如何在谷歌上搜索

我想做的是:

  • 获取检测到的扫描仪数量计数:true(和
    false
    ),按扫描仪名称分组。例如,类似这样的内容(对于
    true
    搜索):

  • 另一个有趣的位涉及
    结果
    字段。它包含恶意软件的名称,我想统计有多少扫描器在特定文件和整个集合中使用相同的恶意软件家族名称


我真的很感激一些例子或指点。我即将编写一个小python脚本来扫描所有JSON文件,并执行我需要的操作,而不是使用MongoDB

要从对象到数组,可以使用(Mongo 3.6及更新版本):

它将导致如下结果:

[{
    "_id" : "TotalDefense",
    "count" : 1.0
},
{
    "_id" : "Bkav",
    "count" : 3.0
}]

至于第二个问题:也适用于对象,因此您可以通过
{scanner:'$scans.k',result:'$scans.v.result'}
进行分组,例如。

尝试发布您的样本集和输出。。。图像在这里不起作用,这确实很有帮助,谢谢。后续问题:为什么在
$group
部分是
$scans.k
,而在
$match
部分是
$scans.v
。我想知道的是
k
v
。基本上,它由
{k,v}
对象组成一个数组,其中
k
是键和
v
-值。我们想按扫描器分组,所以这个对象的键,但按其中一个值过滤。啊,明白了。现在它有意义了。非常感谢你。
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
}]