Mongodb中的聚合函数使用:按月统计数量

it2022-05-05  106

案例:mongodb中有统计表(stat_list)表,存有每天的统计数据,现在需要按月计算,则需要用到mongo的聚合函数aggregate。

"_id" : ObjectId("5d00d3b66939c1efb80ba325"), "date" : "2019-06-12", "daily_count" : "164.34万",

解决方案: 1、将daily_count去掉万字,然后再转成整型相加;(PS:吐槽下,不知道为什么最原始的数据源要存成这样,最好还是不要带单位存储) 2、将date中的月份提取; 直接用substr即可。

第一步中将万字去掉并转成整型,直接遍历更新下数据即可。
原数据:daily_count" : "164.34万" 更新后的数据:daily_count" : 164.34
第一种正则表达式匹配
db.getCollection('stat_list_copy').find().forEach( function(item){ friendsCount = item.daily_count friendsCount = (friendsCount.match(/.*?(?=万)/)) newFriendsCount = parseFloat(friendsCount[0]) db.getCollection('stat_list_copy').update({'_id':item._id},{$set:{"daily_count":newFriendsCount}}) } )
第二种直接replace替换(只有一个万字)
db.getCollection('stat_list_copy').find().forEach( function(item){ friendsCount = item.daily_count newFriendsCount = parseFloat(friendsCount.toString().replace("万","")) db.getCollection('stat_list_copy').update({'_id':item._id},{$set: {"daily_count":newFriendsCount}}) } )

结果完成:

Updated 1 existing record(s) in 1221ms Updated 1 existing record(s) in 141ms Updated 1 existing record(s) in 169ms Updated 1 existing record(s) in 8ms Updated 1 existing record(s) in 9ms Updated 1 existing record(s) in 9ms Updated 1 existing record(s) in 8ms
第二步:使用聚合函数按月相加

这种方式不会改变表结构

db.getCollection('stat_list_copy').aggregate( [ {$project:{month:{$substr:["$date",5,2]},"daily_count":1}}, {$group:{_id:"$month",month_count:{$sum:"$daily_count"}}} ])

结果:

/* 1 */ { "_id" : "07", "month_count" : 155.24 } /* 2 */ { "_id" : "06", "month_count" : 535.23 } /* 3 */ { "_id" : "05", "month_count" : 67.47 } /* 4 */ { "_id" : "03", "month_count" : 280.7 } /* 5 */ { "_id" : "04", "month_count" : 160.37 }
字段类型编号

1 Double 浮点型 2 String UTF-8字符串都可表示为字符串类型的数据 3 Object 对象,嵌套另外的文档 4 Array 值的集合或者列表可以表示成数组 5 Binary data 二进制 7 Object id 对象id是文档的12字节的唯一 ID 系统默认会自动生成 8 Boolean 布尔类型有两个值TRUE和FALSE 9 Date 日期类型存储的是从标准纪元开始的毫秒数。不存储时区 10 Null 用于表示空值或者不存在的字段 11 Regular expression 采用js 的正则表达式语法 13 JavaScript code 可以存放Javasript 代码 14 Symbol 符号 15 JavaScript code with scope 16 32-bit integer 32位整数类型 17 Timestamp 特殊语义的时间戳数据类型 18 64-bit integer 64位整数类型

MongoDB常用操作整理


最新回复(0)