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

问题描述 投票:1回答:1

我收到了来自VirusTotal的一堆报告,并对自己说:“为了创建我需要的统计数据,为什么不将数据放入MongoDB并简单地查询它。不能太难,现在,可以吗?”

好吧,它可以。这是基本数据格式。

data format

我最感兴趣的是scans阵列。不幸的是,扫描仪名称是一个对象的关键,因为我甚至不是MongoDB新手,我不知道如何处理它。天哪,我甚至不知道如何搜索谷歌。

我想做什么:

  • 计算有多少扫描仪有detected:true(和false),按扫描仪名称分组。例如像这样(对于true搜索): Bkav: 20000 TotalDefense: 19238 BitDefender: 39132 ...
  • 另一个有趣的方面将涉及result领域。它包含恶意软件的名称,我想创建一个统计信息,有多少扫描程序对特定文件和整个集合使用相同的恶意软件系列名称。

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

mongodb
1个回答
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'}分组。

© www.soinside.com 2019 - 2024. All rights reserved.