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

时间:2018-08-05 14:28:57

标签: mongodb

我从VirusTotal那里收到了一堆报告,心想:“为了创建所需的统计信息,为什么不将数据放入MongoDB并简单地对其进行查询。现在太难了,可以吗? ?”

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

data format

我对scans数组最感兴趣。不幸的是,扫描仪名称是对象的键,并且由于我什至都不是MongoDB新手,所以我不知道如何进行此操作。地狱,我什至不知道如何在Google上搜索。

我想做什么:

  • 获取按扫描仪名称分组的detected:true(和false)扫描仪数量。例如这样的内容(用于true搜索):

    Bkav: 20000
    TotalDefense: 19238
    BitDefender: 39132
    ...
    
  • 另一个有趣的地方是result字段。它包含恶意软件的名称,我想创建一个统计信息,以统计有多少扫描程序针对特定文件和整个集合使用相同的恶意软件家族名称。

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

1 个答案:

答案 0 :(得分:1)

要从对象到数组,可以使用$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'}进行分组。