首页 > 数据库 >Python爬虫之mongodb的聚合操作

Python爬虫之mongodb的聚合操作

时间:2022-10-14 11:36:41浏览次数:45  
标签:province group Python mongodb userid 爬虫 db country id


mongodb的聚合操作

学习目标
  1. 了解 mongodb的聚合原理
  2. 掌握 mongdb的管道命令
  3. 掌握 mongdb的表达式

1 mongodb的聚合是什么

聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。

语法:​​db.集合名称.aggregate({管道:{表达式}})​

Python爬虫之mongodb的聚合操作_数据

2 mongodb的常用管道和表达式

知识点:

  • 掌握mongodb中管道的语法
  • 掌握mongodb中管道命令
2.1 常用管道命令

在mongodb中,⽂档处理完毕后, 通过管道进⾏下⼀次处理
常用管道命令如下:

  • ​$group​​: 将集合中的⽂档分组, 可⽤于统计结果
  • ​$match​​: 过滤数据, 只输出符合条件的⽂档
  • ​$project​​: 修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果
  • ​$sort​​: 将输⼊⽂档排序后输出
  • ​$limit​​: 限制聚合管道返回的⽂档数
  • ​$skip​​: 跳过指定数量的⽂档, 并返回余下的⽂档
2.2 常用表达式

表达式:处理输⼊⽂档并输出
语法:​​​表达式:'$列名'​​ 常⽤表达式:

  • ​$sum​​: 计算总和, $sum:1 表示以⼀倍计数
  • ​$avg​​: 计算平均值
  • ​$min​​: 获取最⼩值
  • ​$max​​: 获取最⼤值
  • ​$push​​: 在结果⽂档中插⼊值到⼀个数组中

3 管道命令之​​$group​

3.1 按照某个字段进行分组

​$group​​是所有聚合命令中用的最多的一个命令,用来将集合中的文档分组,可用于统计结果

使用示例如下

db.stu.aggregate(
{$group:
{
_id:"$gender",
counter:{$sum:1}
}
}
)

其中注意点:

  • ​db.db_name.aggregate​​是语法,所有的管道命令都需要写在其中
  • ​_id​​​ 表示分组的依据,按照哪个字段进行分组,需要使用​​$gender​​表示选择这个字段进行分组
  • ​$sum:1​​ 表示把每条数据作为1进行统计,统计的是该分组下面数据的条数
3.2 group by null

当我们需要统计整个文档的时候,​​$group​​ 的另一种用途就是把整个文档分为一组进行统计

使用实例如下:

db.stu.aggregate(
{$group:
{
_id:null,
counter:{$sum:1}
}
}
)

其中注意点:

  • ​_id:null​​​ 表示不指定分组的字段,即统计整个文档,此时获取的​​counter​​表示整个文档的个数
3.3 数据透视

正常情况在统计的不同性别的数据的时候,需要知道所有的name,需要逐条观察,如果通过某种方式把所有的name放到一起,那么此时就可以理解为数据透视

使用示例如下:

  1. 统计不同性别的学生
db.stu.aggregate(
{$group:
{
_id:null,
name:{$push:"$name"}
}
}
)
  1. 使用​​$$ROOT​​可以将整个文档放入数组中
db.stu.aggregate(
{$group:
{
_id:null,
name:{$push:"$$ROOT"}
}
}
)
3.4 动手

对于如下数据,需要统计出每个country/province下的userid的数量(同一个userid只统计一次)

{ "country" : "china", "province" : "sh", "userid" : "a" }  
{ "country" : "china", "province" : "sh", "userid" : "b" }
{ "country" : "china", "province" : "sh", "userid" : "a" }
{ "country" : "china", "province" : "sh", "userid" : "c" }
{ "country" : "china", "province" : "bj", "userid" : "da" }
{ "country" : "china", "province" : "bj", "userid" : "fa" }

参考答案

db.tv3.aggregate(
{$group:{_id:{country:'$country',province:'$province',userid:'$userid'}}},
{$group:{_id:{country:'$_id.country',province:'$_id.province'},count:{$sum:1}}}

4 管道命令之​​$match​

​$match​​​用于进行数据的过滤,是在能够在聚合操作中使用的命令,和​​find​​​区别在于​​$match​​​ 操作可以把结果交给下一个管道处理,而​​find​​不行

使用示例如下:

  1. 查询年龄大于20的学生
db.stu.aggregate(
{$match:{age:{$gt:20}}
)
  1. 查询年龄大于20的男女学生的人数
db.stu.aggregate(
{$match:{age:{$gt:20}}
{$group:{_id:"$gender",counter:{$sum:1}}}
)

5 管道命令之​​$project​

​$project​​用于修改文档的输入输出结构,例如重命名,增加,删除字段

使用示例如下:

  1. 查询学生的年龄、姓名,仅输出年龄姓名
db.stu.aggregate(
{$project:{_id:0,name:1,age:1}}
)
  1. 查询男女生人生,输出人数
db.stu.aggregate(
{$group:{_id:"$gender",counter:{$sum:1}}}
{$project:{_id:0,counter:1}}
)
5.1 动手练习

对于如下数据:统计出每个country/province下的userid的数量(同一个userid只统计一次),结果中的字段为{country:"",province:"",counter:"*"}

{ "country" : "china", "province" : "sh", "userid" : "a" }  
{ "country" : "china", "province" : "sh", "userid" : "b" }
{ "country" : "china", "province" : "sh", "userid" : "a" }
{ "country" : "china", "province" : "sh", "userid" : "c" }
{ "country" : "china", "province" : "bj", "userid" : "da" }
{ "country" : "china", "province" : "bj", "userid" : "fa" }

参考答案

db.tv3.aggregate(
{$group:{_id:{country:'$country',province:'$province',userid:'$userid'}}},
{$group:{_id:{country:'$_id.country',province:'$_id.province'},count:{$sum:1}}},
{$project:{_id:0,country:'$_id.country',province:'$_id.province',counter:'$count'}}
)

6 管道命令之​​$sort​

​$sort​​用于将输入的文档排序后输出

使用示例如下:

  1. 查询学生信息,按照年龄升序
db.stu.aggregate({$sort:{age:1}})
  1. 查询男女人数,按照人数降序
db.stu.aggregate(
{$group:{_id:"$gender",counter:{$sum:1}}},
{$sort:{counter:-1}}
)

7 管道命令之​​$skip​​​ 和 ​​$limit​

  • ​$limit​​限制返回数据的条数
  • ​$skip​​ 跳过指定的文档数,并返回剩下的文档数
  • 同时使用时先使用skip在使用limit

使用示例如下:

  1. 查询2条学生信息
db.stu.aggregate(
{$limit:2}
)
  1. 查询从第三条开始的学生信息
db.stu.aggregate(
{$skip:3}
)
  1. 统计男女生人数,按照人数升序,返回第二条数据
db.stu.aggregate(
{$group:{_id:"$gender",counter:{$sum:1}}},
{$sort:{counter:-1}},
{$skip:1},
{$limit:1}
)

8 小结

  1. 理解聚合操作的是在干什么
  2. 掌握​​$group​​​,​​$match​​​,​​$project​​的使用
  3. 熟悉​​$sort​​​,​​$limit​​​,​​$skip​​的使用
  4. 实现常用的表达式


标签:province,group,Python,mongodb,userid,爬虫,db,country,id
From: https://blog.51cto.com/u_15829196/5755957

相关文章

  • Python爬虫之mongodb的索引操作
    Mongodb的索引操作学习目标掌握mongodb索引的创建,删除操作掌握mongodb查看索引的方法掌握mongodb创建唯一索引的方法1.为什么mongdb需要创建索引加快查询速度进行数据的......
  • Python爬虫之scrapy构造并发送请求
    scrapy数据建模与请求学习目标:应用在scrapy项目中进行建模应用构造Request对象,并发送请求应用利用meta参数在不同的解析函数中传递数据1.数据建模通常在做项目的过程中,......
  • Python爬虫之scrapy模拟登陆
    scrapy模拟登陆学习目标:应用请求对象cookies参数的使用了解start_requests函数的作用应用构造并发送post请求1.回顾之前的模拟登陆的方法1.1requests模块是如何实现模......
  • Python爬虫之scrapy_redis原理分析并实现断点续爬以及分布式爬虫
    scrapy_redis原理分析并实现断点续爬以及分布式爬虫学习目标了解scrapy实现去重的原理了解scrapy中请求入队的条件掌握scrapy_redis基于url地址的增量式单机爬虫掌握scr......
  • Python爬虫之scrapy_redis概念作用和流程
    scrapy_redis概念作用和流程学习目标了解分布式的概念及特点了解scarpy_redis的概念了解scrapy_redis的作用了解scrapy_redis的工作流程在前面scrapy框架中我们已经能够......
  • python对utf-8的中文转换
    #python3默认支持utf-8,因此对于\uXXXX这种格式的中文,可以直接转换,但经常爬虫抓取回来的中文是\\uXXXX格式,因此需要进行转换s1='\u65f6\u4e0d\u53ef\u5931\uff0c\u65f6\u4......
  • python2 | python3 | 文本清洗正则匹配
    python3写的清洗文本代码在python2用不了,会出现各种编码问题,经过痛苦的一晚上加班终于搞完了,记录一下。python2defclean_text(content):"""去除话题词,链接,@用户,图......
  • python 查看文件最新的几行
      importlinecachedefget_line_count(filename):count=0withopen(filename,'r')asf:whileTrue:buffer=f.read(1024*......
  • Python Select 解析
    首先列一下,sellect、poll、epoll三者的区别 select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中......
  • 力扣609(java&python)-在系统中查找重复文件(中等)
    给你一个目录信息列表 paths,包括目录路径,以及该目录中的所有文件及其内容,请你按路径返回文件系统中的所有重复文件。答案可按任意顺序返回。一组重复的文件至少包括......