mongodb按日期聚合,计数

发布于 2022-09-05 04:13:20 字数 1951 浏览 19 评论 0

数据类型:

{'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}}]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

穿越时光隧道 2022-09-12 04:13:20

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

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
        }
    ]
}
苄①跕圉湢 2022-09-12 04:13:20

楼上说得没错。实际上并没有把值转换成列名的方法,也不可能有,因为值可能并不满足列名的规则。
不过实际写法上还可以再精简一些:

db.test.insert([
    {'name':'tom','date':new Date(2017, 7, 1, 11, 35)},
    {'name':'tom','date':new Date(2017, 7, 1, 12, 25)},
    {'name':'tom','date':new Date(2017, 7, 3, 13, 32)},
    {'name':'bob','date':new Date(2017, 7, 1, 15, 37)},
    {'name':'bob','date':new Date(2017, 7, 2, 9, 15)},
    {'name':'sue','date':new Date(2017, 7, 1, 17, 15)},
    {'name':'sue','date':new Date(2017, 7, 2, 12, 25)}
])
db.test.aggregate([
    {
        $group: {
            _id: {
                date: {
                    $dateToString: {
                        format: '%Y-%m-%d', 
                        date: '$date'
                    }, 
                },
                name: "$name"
            },
            count: {$sum: 1}
        }
    }, {
        $group: {
            _id: "$_id.date",
            name: {
                $push: {
                    name: "$_id.name",
                    count: "$count"
                }
            }
        }
    }
])

结果:

{ "_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 } ] }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文