在很多时候,我们需要临时统计下数据库中的数据,一般的做法是写一个脚本,通过代码来统计分析。 在mongo中,其实可以直接使用命令就可以实现,主要得益于其非常强大的统计命令支撑。
下面通过一个例子来看下mongo中强大的统计分析命令。
有这样一个集合,test集合字段示例如下:
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,命令如下:
cmgo-dho4eog7_0:PRIMARY> db.test.aggregate([{$project: {"cpu": {"$ifNull": ["$properties.cpu", 2]}}}, {$group: {_id: "cpu", total: {$sum: "$cpu"}}}])
{ "_id" : "cpu", "total" : 3479 }下面来解释下这个命令的含义
db.collection. aggregate(pipeline,options)
[ expression, replacement-expression-if-null ] ,用于判断第一个表达式是否为 null,如果为 null 则返回第二个参数的值,如果不为 null 则返回第一个参数的值。
_id: "cpu"就是随便取得一个名字。
上面的project和group都是appreciate中的pipeline,也就是聚合操作中的管道命令,
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。下面是一些常见的命令:
更多管道命令可以查看mongo的官方文档: https://www.mongodb.com/docs/manual/reference/operator/aggregation-pipeline/