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}}]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我只能做到这样.
我不知道如何将查询出来的值作为一个对象的键,也就是,我不知道如何动态拼接对象
源数据
SQL 语句
查询结果
楼上说得没错。实际上并没有把值转换成列名的方法,也不可能有,因为值可能并不满足列名的规则。
不过实际写法上还可以再精简一些:
结果: