首页 > 解决方案 > MongoDB对象数组,按一些简单条件计数并按对象键分组

问题描述

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

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

数据格式

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

我想做的事:

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

标签: 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'}例如分组。


推荐阅读