mongodb数组查询 - mongodb按日期聚合,计数

查看:305
本文介绍了mongodb数组查询 - mongodb按日期聚合,计数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

数据类型:

{'name':'tom','date':datetime.datetime(2017, 7, 1, 11, 35)}
{'name':'tom','date':datetime.datetime(2017, 7, 1, 12, 25)}
{'name':'tom','date':datetime.datetime(2017, 7, 3, 13, 32)}
{'name':'bob','date':datetime.datetime(2017, 7, 1, 15, 37)}
{'name':'bob','date':datetime.datetime(2017, 7, 2, 9, 15)}
{'name':'sue','date':datetime.datetime(2017, 7, 1, 17, 15)}
{'name':'sue','date':datetime.datetime(2017, 7, 2, 12, 25)}

想要按照日期来进行聚合统计出每个人每天有几条记录,
希望结果是这样的:

{'date':'2017-7-1','name':['tom':1,'bob':1,'sue':1]}
{'date':'2017-7-2','name':['bob':1,'sue':1]}
{'date':'2017-7-3','name':['bob':1,'sue':1]}

困惑了好几天了,按照日期来分组弄出来了,但是计数不晓得怎么弄

db.coll.aggregate([
                {'$group':{'_id':{'$dateToString':{'format':'%Y-%m-%d','date':'$date'}}}}
                ])

这样把日期给分组了,但是对‘name’进行计数,却不晓得怎么弄


谢谢楼下两位的回答,这样已经解决了问题。
抱歉上面的格式错了,应该是这个

{'date':'2017-7-1','name':{'tom':1,'bob':1,'sue':1}}

我用的python,另外定义一个函数就可以转换过来了.
格式从语言层面就可以解决了,

s=[{ "_id" : "2017-08-03", "name" : [ { "name" : "tom", "count" : 1 } ] },
{ "_id" : "2017-08-01", "name" : [ { "name" : "sue", "count" : 1 }, { "name" : "bob", "count" : 1 }, { "name" : "tom", "count" : 2 } ] },
{ "_id" : "2017-08-02", "name" : [ { "name" : "sue", "count" : 1 }, { "name" : "bob", "count" : 1 } ] }]

def db_dict(s):
    dicts=[]
    for line in s:
        res_dict={}
        for x in line.get('name'):
            names=x.get('name')
            values=x.get('count')
            res_dict[names]=values
        res=dict(dates=line.get('_id'),count=res_dict)
        dicts.append(res)
    return dicts

函数执行完的结果
就得到想要的格式了

[{'dates': '2017-08-03', 'count': {'tom': 1}},
 {'dates': '2017-08-01', 'count': {'tom': 2, 'bob': 1, 'sue': 1}}, 
{'dates': '2017-08-02', 'count': {'bob': 1, 'sue': 1}}]

解决方案

我只能做到这样.
我不知道如何将查询出来的值作为一个对象的键,也就是,我不知道如何动态拼接对象
源数据

db.getCollection('test').insert([{'name':'tom','date':'2017-7-1'},
{'name':'tom','date':'2017-7-1'},
{'name':'tom','date':'2017-7-3'},
{'name':'bob','date':'2017-7-1'},
{'name':'bob','date':'2017-7-2'},
{'name':'sue','date':'2017-7-1'},
{'name':'sue','date':'2017-7-2'}
])

SQL 语句

db.getCollection('test').aggregate([
    {
       $group: {
           _id: {
               'name': '$name',
               'date': '$date'
           },
           count: { $sum: 1 }
       } 
    },{
        $project: {
            '_id': 0,
            'date': '$_id.date',
            'name': {
                'name': '$_id.name',
                'count': '$count'
            }
        }
    },{
        $group: {
            _id: '$date',
            'name': {$push: '$name'}
        }    
    }
])

查询结果

/* 1 */
{
    "_id" : "2017-7-3",
    "name" : [ 
        {
            "name" : "tom",
            "count" : 1.0
        }
    ]
}

/* 2 */
{
    "_id" : "2017-7-1",
    "name" : [ 
        {
            "name" : "sue",
            "count" : 1.0
        }, 
        {
            "name" : "bob",
            "count" : 1.0
        }, 
        {
            "name" : "tom",
            "count" : 2.0
        }
    ]
}

/* 3 */
{
    "_id" : "2017-7-2",
    "name" : [ 
        {
            "name" : "sue",
            "count" : 1.0
        }, 
        {
            "name" : "bob",
            "count" : 1.0
        }
    ]
}

这篇关于mongodb数组查询 - mongodb按日期聚合,计数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆