mongodb - MongoDB对象数组,按一些简单条件计数并按对象键分组
问题描述
我有一堆来自 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'}
例如分组。
推荐阅读
- python - Regex: replace Latin numbers after a word
- css - 包裹孩子后,让flex容器调整宽度到它的孩子而不是它的父母
- node.js - 卸载使用 npx 安装的应用程序的正确方法是什么?
- django - 如何为 Heroku 部署正确指定 wsgi?
- apache - 包含 NGINX 重写规则信息的资源
- html - 当值变化颤动时如何渲染文本?
- c++ - C++ 使用复制构造函数避免临时对象破坏
- java - Gradle 中的 Java char 'ß' 产生编译器错误
- ajax - 可以使用 AJAX 从另一个页面 POST 到 Razor 页面模型吗?(例子)
- python - Python 蒙特卡罗模拟循环