使用pymongo进行group by操作有两种基本方式,他们都是mongodb的原生命令,于收集对象上调用。
def聚合(自我,管道,* * kwargs): def集团(减、自我、关键条件,初步确定=None, * * kwargs):
<强>示例数据强>
演示用的数据为一个订单表,含有以下字段:
订单
_id: ObjectID
引用>
用户标识:int
itemid: int
数量:int
时间:,,字符串
主要任务为:
<李>统计某个时间区间内每个userid的订单数李> <李>统计某个时间区间内每组(userid, itemid)共售出多量少李>
即分别为:单键分组和多键分组
聚合操作只接受一个列表类型的参数——管道。其每一个元素都是一步操作(舞台)。全部可用的阶段可参见:
https://docs.mongodb.com/manual/meta/aggregation-quick-reference/阶段里油面的阶段是有序且可重复的,mongodb会顺序执行,因此一定要记得把像元匹配这样的阶段放前面。
单键分组
start_time=' 2010-10-10就是' end_time=' 2010-10-10 23:59:59 ' 匹配={ “时间”:{ “美元gte”: start_time, “$ lte”: end_time, } } groupby=氨晔丁? 组={ “_id”: " $ % s " %(如果其他groupby没有groupby), “数”:{“美元金额”:1} } ret=collection.aggregate ( ( {$匹配:匹配}, {“美元集团”:集团}, ] ) 在在在受潮湿腐烂 [{“_id”: 123年,“数”:500},…]集团指美元定了返回数据的格式,其中_id字段是分组的键。
groupby=(“itemid”、“标识”) 组={ “_id”:{关键:(' $ % s ' %键)的关键groupby}或{“没有”:“没有美元”}, “数”:{“美元金额”:“美元金额”} } ret=collection.aggregate ( ( {$匹配:匹配}, {“美元集团”:集团}, ] ) 在在在受潮湿腐烂 [{_id: {“itemid”: 111年,“user_id”: 123},“数”:100},…]这里与单键分组的区别仅在于_id的类型,改成了一个字典,从而允许多键组合。
为了提高通用性,建议始终使用字典的格式。
另外,既然字符串和字典都可以做键,那么列表行不行呢?答案是不的行,列表里的元素,(如美元userid)并不会被自动识别为字段,而是仅作一般字符串处理。
最后关于聚合中可用的运算操作符,可参见:
https://docs.mongodb.com/manual/reference/operator/aggregation/蓄电池
如其中美元的addToSet也是颇有用处,可以用来实现“统计每个人都买过哪些itemid”这样的功能:
组={ “_id”:{“标识”:“userid美元”}, “dist_itemids”: {“addToSet美元”:“itemid美元”}, }
相较于聚合的全能,集团是专门处理分组操作的一个命令,因此这个方法的参数也更明确,主要参数为:
<李>键列表,分组的键李> <李>条件dict过滤条件李> <李>初始dict,初始值李> <李>/bson减少字符串。李代码,js的减少函数>
例:
关键=(“标识”、“itemid”) 条件={ “时间”:{ “美元gte”: start_time, “$ lte”: end_time, } } 初始={“计数”:0} 减速机=代码(“”” 函数(obj,上一页){ 上一页。数=上一页。数+ obj.amount } ”“”) ret=集合。集团(关键条件、初始、减速机) 在在在受潮湿腐烂 [{“标识”:110年,“itemid”: 123年,“数”:500.0},…]这里的分组数据聚合,是通过减少函数实现的,这个函数与python的减少不同,它不需要返回值,而是直接修改prev参数即可,这个参数会自动代入下一次调用。这可能是js的实现。
须注意的是js默认返回浮点数。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
pymongo中集团的操作方法教程