pymongo中使用聚合查询
在使用mongo数据库时,简单的查询基本上可以满足大多数的业务场景,但是试想一下,如果要统计某一荐在指定的数据中出现了多少次该怎么查询呢?笨的方法是使用find 将数据查询出来,再使用count() 方法进行数据统计,这个场景还好,但是如果要求其中某个字段的和呢?是不是就非得遍历出相应的数据然后再进行求和运算呢?
在mysql中我们经常会用到count、group by 等查询,在mongodb中我们也可以使用聚合查询。
假设有这样的一组数据
价格
里面记录了每种水果的价格,现在我要统计一下,各种水果在这张表中出现的次数,如果不用聚合查询的话,思路应该是这样,先把表中所有的数据都取出来,然后初始化一个字典,然后再遍历每一行的数据,获取它的fName ,然后再更新字典中的计数,这种方法的时间复杂度是O(N)的,如果数据量很大的话不是很好,下面来看一下使用聚合是怎么查询的。
聚合查询使用的是aggregate函数,它的参数是 pipeline 管道,管道的概念是用于将当前命令的输出结果作为下一个命令的参数,管道是有顺序的,比如通过第一个管道操作以后没有符合的数据那么之后的管道操作也就不会有输入,所以一定得要注意管道操作的顺序。由于对于上述问题,我们要的是所的数据统计,所以这里就不需要$match了
1 |
from pymongo import MongoClient client = MongoClient(host=['%s:%s'%(mongoDBhost,mongoDBport)]) |
数据大家可以自已构造,这里主要是看aggregate的用法。
得到的结果是
1 |
{u'count': 8, u'_id': u'banana'}
|
可以看到,一步操作就可以得到相应的统计了。
如果想要获取价格在50以上的各种统计呢?
这时有pipeline应该再$group 之前加上$match 操作
1 |
pipeline = [ |
一定要注意顺序
$match里的条件其实就和使用find函数里是一样的。
下面重点来说说$group操作,group意为分组,指数据根据哪个字段进行分组,上面使用的{'$group': {'_id': "$fName", 'count': {'$sum': 1},_id为所要分的组,这里是以fName字段分的,后面的'count': {'$sum': 1},这里的$sum就是求和的意思,后面的值是1,也就是说每出现一次就加1,这样就能达到计数的目的了,如果要计算价格 price 的和,那么这里就应该写成这样
1 |
{'$group': {'_id': "$fName", 'count': {'$sum': '$price'}}}
|
注意这里的字段要有$ 的,如果我想要求价格的平均值呢?也就是先要求出价格的总数,再除以商品的个数,但是这里有一个$avg 操作
1 |
pipeline = [ |
得到的结果
1 |
{u'_id': u'banana', u'avg': 66.200000000000003}
|
类似于$ave的操作还有很多,比较常用的是$min(求最小值),$max(求最大值)
1 |
pipeline = [ |
所有支持的操作可以参考官方文档:group 支持的操作
以哪个字段进行分组时必须使用_id。
接下来看一下多键分组。
以上在使用group 进行分组查询的时候,用到的_id都是单一字段,比如我的数据库中有如下数据
带用户的数据
带有一个user 字段了,那如果我要根据user和fName进行分组该如何操作呢?
这里可以传一个字典进去
1 |
pipeline = [ |
得到的结果如下:
1 |
{u'count': 1, u'avg': 93.0, u'min': 93, u'max': 93, u'_id': {u'user': u'fanjieying', u'fName': u'pear'}, u'priceAll': 93}
|
这里的结果显示出每个用户买了哪个商品,一共花了多少钱,最大最小平均值等都可以一次性的展示了,如果要是使用for循环自已遍历的话这种时间复杂度相当高。
这里只是简单的说了下$group和$match 的用法,聚合查询支持很多种操作(称为stages),可以通官方文档进行查看
pymongo 中pipeline中的stages
pymongo中使用聚合查询的更多相关文章
- 关于在elasticSearch中使用聚合查询后只显示10个bucket的问题
先看下面es查询语句 { "size": 0, "aggs" : { "all_articleId" : { "terms&quo ...
- ThinkPHP中使用聚合查询去重求和
我使用的是TP5.1 首先去model类里面设置failed条件: 想要的效果: 数据库展示: 代码: eturn self::alias('gr') ->join('gs_staff gs', ...
- mongo客户端升级导致pymongo中使用聚合函数时出现异常
一.异常信息 The 'cursor' option is required, except for aggregate with the explain argument 二.解决办法 #部分源代码 ...
- Mongoose中的关联表查询 && 聚合查询
注:阅读此篇文章,需要有一定的Mongo基础.基本的不会再重复介绍. 例: 有两张表,一张是博客列表,另外一张是博客的标签表.现在我们要做两张表的插入和关联查询. 创建两张表的Schema 主表bl ...
- Rafy 中的 Linq 查询支持(根据聚合子条件查询聚合父)
为了提高开发者的易用性,Rafy 领域实体框架在很早开始就已经支持使用 Linq 语法来查询实体了.但是只支持了一些简单的.常用的条件查询,支持的力度很有限.特别是遇到对聚合对象的查询时,就不能再使用 ...
- 开发中使用mongoTemplate进行Aggregation聚合查询
笔记:使用mongo聚合查询(一开始根本没接触过mongo,一点一点慢慢的查资料完成了工作需求) 需求:在订单表中,根据buyerNick分组,统计每个buyerNick的电话.地址.支付总金额以及总 ...
- django系列5.5--分组查询,聚合查询,F查询,Q查询,脚本中调用django环境
一.聚合查询 aggregate(*args, **args) 先引入需要的包,再使用聚合查询 #计算所有图书的平均价格 from django.db.models import Avg Book.o ...
- django 中的聚合和分组 F查询 Q查询 事务cookies和sessions 066
1 聚合和分组 聚合:对一些数据进行整理分析 进而得到结果(mysql中的聚合函数) 1aggregate(*args,**kwargs) : 通过对QuerySet进行计算 ,返回一个聚合值的字典. ...
- Django中多表的增删改查操作及聚合查询、F、Q查询
一.创建表 创建四个表:书籍,出版社,作者,作者详细信息 四个表之间关系:书籍和作者多对多,作者和作者详细信息一对一,出版社和书籍一对多 创建一对一的关系:OneToOne("要绑定关系的表 ...
随机推荐
- 本地安装了flash,前台浏览器还显示需要安装flash?是因为版本需要对应
NPAPI:适用于FireFox(火狐).Safari(苹果).Opera (欧朋,12.17版以下) PPAPI:适用于Chromium浏览器.Opera (欧朋,15.00版以上) ActiveX ...
- 析构中delete this
查看下面代码如何出错 #include <iostream> using namespace std; class A { public: A() { p = this; } ~A() { ...
- 2.Jmeter 快速入门教程(二)--创建简单web测试 打印 E-mail
今天我们就来实际用Jmeter创建一个测试场景,并进行性能测试. 注:由于本人使用中文版本,使用英文版本的请注意具体的菜单及参数名称. 1. 添加线程组(相当于lr里的scenario 设置) 打开j ...
- postgis常用的函数
常见函数:http://postgis.net/docs/reference.html ST_GeometryType(geometry) —— 返回几何图形的类型 ST_NDims(ge ...
- ORACLE中的varchar2()与nvarchar2()的讲解
Oracle中NVARCHAR2和VARCHAR2的区别 [转]NVARCHAR2和VARCHAR2的区别,从使用角度来看区别在于:NVARCHAR2在计算长度时和字符集相关的,例如数据库是中文字符集 ...
- css中的居中问题
前两天写了一篇关于display:table的用法,里面涉及到居中的问题,这两天愈发觉得css中的居中是一个值得关注的问题,现总结如下. 一.垂直居中 (1)inline或者inline-*元素 1. ...
- Spring Boot实现通用的接口参数校验
Spring Boot实现通用的接口参数校验 Harries Blog™ 2018-05-10 2418 阅读 http ACE Spring App API https AOP apache IDE ...
- 备份一下我的.bash_aliases文件
# 这是陈悦老师的课程练习目录 alias cdchen="cd /home/branches/Documents/chen" # 每次grep都显示出行号 alias grep= ...
- pytest-参数化2
import pytesttest_user_data=['linda','sai','tom']@pytest.fixture(scope='module')def login(request): ...
- 一、最新Kafka单节点部署+测试 完整
每次学一个东西从基础的开始,循序渐进. 不急不躁,路还很长. 所有教程都是学习汪文君大神的kafka教程的. 一.部署 这里选的kafka版本是 0.10.2.1 下载连接 https://dow ...