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

案例: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常用操作整理

你可能感兴趣的:(Mongo)