Mongo聚合分析命令浅析

在很多时候,我们需要临时统计下数据库中的数据,一般的做法是写一个脚本,通过代码来统计分析。

在mongo中,其实可以直接使用命令就可以实现,主要得益于其非常强大的统计命令支撑。

下面通过一个例子来看下mongo中强大的统计分析命令。

有这样一个集合,test集合字段示例如下:

go 复制代码
cmgo-dho4eog7_0:PRIMARY> db.resource_f57ddf3fa743426b93cd6390e748699b.findOne({})
{
        "_id" : NumberLong(688),
        "created_at" : ISODate("2022-10-27T12:42:39.256Z"),
        "updated_at" : ISODate("2023-07-13T04:55:38.060Z"),
        "deleted_at" : ISODate("0001-01-01T00:00:00Z"),
        "deleted" : false,
        "name" : "",
        "labels" : {

        },
        "properties" : {
                "disk" : 550,
                "mem" : 16,
                "tag" : "DAILY_BUILD_COMMON",
                "ip" : "x.x.x.x",
                "monitorItem" : "all",
                "password" : "xxx",
                "assetId" : "xxxxx",
                "rackId" : 265093,
                "cabinet" : "G160501-C03",
                "serverOperator" : "hobohuang",
                "cpu" : 12,
                "idcName" : "xxxxx",
                "cmdbModuleId" : 1604826,
                "osVersion" : ""
        },
        "creator" : "xxx",
        "editor" : "xxx",
        "status" : 3,
        "project_id" : "7879",
        "res_def_id" : NumberLong(2),
        "group" : "IDLE",
        "description" : "",
        "tags" : [
                ""
        ],
        "message" : "",
        "type" : 1,
        "external_props" : null,
        "source" : 0
}

现在要统计test集合properties中的cpu总和,如果cpu没空,则默认为2,命令如下:

go 复制代码
cmgo-dho4eog7_0:PRIMARY> db.test.aggregate([{$project: {"cpu": {"$ifNull": ["$properties.cpu", 2]}}}, {$group: {_id: "cpu", total: {$sum: "$cpu"}}}])
{ "_id" : "cpu", "total" : 3479 }

下面来解释下这个命令的含义

  1. db.test.aggregate()

    表示对test集合进行聚合操作,聚合操作就是通过aggregate()函数来完成一系列的聚合查询,主要用于处理如:统计,平均值,求和等,并返回计算后的结果。

    表达式:db.collection. aggregate(pipeline,options)

  2. $project

    aggregate的管道命令,表示对集合中的字段值进行预处理并返回指定key及其值。

    在这个例子中,就表示对properties中的cpu进行预处理,判断是否null,如果null则设置为2,并且将字段properties的cpu整体替换为cpu属性,用于后面其他管道读取。

  3. $ifNull

    表达式:[ expression, replacement-expression-if-null ] ,用于判断第一个表达式是否为 null,如果为 null 则返回第二个参数的值,如果不为 null 则返回第一个参数的值。

  4. $group

    aggregate的管道命令,表示对集合数据进行分组统计,这里一定要有一个_id:key作为分组的表示,比如集合中有一个字段为user,那么就表示以user分组统计。

    但是对于不想分组统计,想要统计整个集合怎么办呢?

    那么就直接定义一个集合不存在的字段即可,比如这里的例子_id: "cpu"就是随便取得一个名字。

  5. $sum

    表示对指定字段求和,这里就是对前面$project管道返回的cpu字段进行求和

上面的$project和$group都是appreciate中的pipeline,也就是聚合操作中的管道命令,

管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。

MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。下面是一些常见的命令:

  • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。

  • :用于过滤数据,只输出符合条件的文档。����ℎ:用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。

  • $limit:用来限制MongoDB聚合管道返回的文档数。

  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。

  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。

  • $group:将集合中的文档分组,可用于统计结果。

  • $sort:将输入文档排序后输出。

  • $geoNear:输出接近某一地理位置的有序文档。

更多管道命令可以查看mongo的官方文档:

https://www.mongodb.com/docs/manual/reference/operator/aggregation-pipeline/

相关推荐
测试界的小码农44 分钟前
【Linux 命令实战(04):文件内容查看,掌握 cat、less、head、tail】
linux·服务器·less
Ashe8131 小时前
MySQL 慢日志先别急着加索引:三个指标能拦掉大半误判
数据库
每月一号准时摆烂1 小时前
服务器运维笔记(一)——使用shell编写实时查看BMC功率的脚本
运维·服务器·笔记
ClouGence1 小时前
最基础的异构数据库 DDL 同步,我们踩过哪些坑?
数据库·mysql·postgresql
时间售卖铺2 小时前
Chrony与SSH实战:精准时间同步与安全远程登录
运维·安全·云原生·ssh
微订校园外卖系统2 小时前
校园代取快递系统选型:现成系统与定制开发的技术核对项
大数据·运维·人工智能·外卖系统·本地生活·微订
QXWZ_IA2 小时前
管道GIS测绘如何实现自动化成图:三种成图方式怎么选
运维·人工智能·安全·自动化
羑悻的小杀马特2 小时前
Redis持久化三剑客:RDB二进制快照、AOF文本日志、混合模式如何守护你的数据安全?
数据库·redis·缓存·aof·持久化存储·rdb
一条破秋裤2 小时前
【1112】Linux中断【整理】
linux·运维·服务器
小呆爱发呆2 小时前
第三章 MySQL 库表操作
数据库·mysql·adb