上一篇主要介绍了MongoDB的基本操作,包括创建、插入、保存、更新和查询等,链接为MongoDB基本操作

在本文中主要介绍MongoDB的聚合以及与Python的交互。

MongoDB聚合

什么是聚合

MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。

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

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

管道一般用于将当前命令的输出结果作为下一个命令的参数。

MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。

常用管道

下面介绍常用的管道:

  • $group:将集合中的文档分组,可用于统计结果
  • $match:过滤数据,只输出符合条件的文档
  • $project:修改输入文档的结构,如重命名、增加、删除字段,也可用于创建计算结果以及嵌套文档
  • $sort:将输入文档排序后输出
  • $limit:限制聚合管道返回的文档数
  • $skip:跳过指定数量的文档,并返回余下的数据
  • $unwind:将数组类型的字段进行拆分

常用聚合表达式

下面介绍常用的聚合表达式:

  • $sum:计算总和,$sum:1表示以1计数
  • $avg:计算平均值
  • $min:获取最小值
  • $max:获取最大值
  • $push:在结果文档中插入值到一个数组中
  • $first:根据资源文档的排序,获取第一个文档数据
  • $last:根据资源文档的排序,获取最后一个文档数据

MongoDB聚合实例

现在假设集合studen中有以下数据:

  1. { "_id" : 1, "name" : "小然", "gender" : 1, "age" : 22, "score" : 95 }
  2. { "_id" : 2, "name" : "小红", "gender" : 0, "age" : 18, "score" : 80 }
  3. { "_id" : 3, "name" : "小亮", "gender" : 1, "age" : 19, "score" : 60 }
  4. { "_id" : 4, "name" : "小强", "gender" : 1, "age" : 23, "score" : 70 }
  5. { "_id" : 5, "name" : "小柔", "gender" : 0, "age" : 20, "score" : 85 }
  6. { "_id" : 6, "name" : "小雷", "gender" : 1, "age" : 25, "score" : 65 }
  7. { "_id" : 7, "name" : "小冉", "gender" : 0, "age" : 19, "score" : 70 }
  8. { "_id" : 8, "name" : "小晴", "gender" : 0, "age" : 18, "score" : 90 }
  9. { "_id" : 9, "name" : "小齐", "gender" : 1, "age" : 24, "score" : 50 }
  • 以性别进行分组
  1. db.students.aggregate({$group:{_id:"$gender"}})

输出结果为:

  • 统计整个文档,获得数据个数和平均分数
  1. db.students.aggregate({$group:{
  2. _id:null,
  3. count:{$sum:1},
  4. avg_score:{$avg:"$score"}
  5. }})

输出结果为:

  • 以性别进行分组,获取不同分组中数据的个数和平均分数
  1. db.students.aggregate({$group:{
  2. _id:"$gender",
  3. count:{$sum:1},
  4. avg_score:{$avg:"$score"}
  5. }})

输出结果为:

  • 使用$project修改输出结果
  1. db.students.aggregate(
  2. {$group:{
  3. _id:"$gender",
  4. count:{$sum:1},
  5. avg_score:{$avg:"$score"}}
  6. },
  7. {$project:{
  8. gender:"$_id",
  9. count:1,
  10. _id:0,
  11. avg_score:"$avg_score"}
  12. }
  13. )

输出结果为:

  • 使用$match选择分数大于等于70的学生,统计男生、女生的人数
  1. db.students.aggregate(
  2. {$match:{score:{$gte:70}}},
  3. {$group:{_id:"$gender",count:{$sum:1}}},
  4. {$project:{gender:"$_id",count:1,_id:0}}
  5. )

输出结果为:

MondoDB与Python的交互

pymongo的安装

使用Python操作MongoDB需要安装pymongo,安装方法很简单,使用pip install pymongo即可。

实例化并建立连接

首先从pymongo中导入MongoClient,然后实例化client,建立连接,代码如下:

  1. from pymongo import MongoClient
  2. client = MongoClient(host = "127.0.0.1",port = 27017)
  3. #操作本机MongoDB可以写成client = MongoClient()
  4. collection = client["test"]["test"]

常用操作实例

  • 插入一条数据
  1. collection.insert_one({"_id":0,"name":"test0"})
  • 插入多条数据
  1. data_list = [{"_id":i,"name":"test{}".format(i)} for i in range(10)]
  2. collection.insert_many(data_list)
  3. data_list = [{"name":"test{}".format(i)} for i in range(10)]
  4. collection.insert_many(data_list)

插入后结果如下图所示,下面的操作都在此数据库上进行操作。

  • 查询一条记录
  1. print(collection.find_one({"name":"test2"}))

输出结果为:

  • 查询所有记录
  1. result = collection.find({"name":"test2"})
  2. for i in result:
  3. print(i)

输出结果为:

  • 更新一条数据
  1. collection.update_one({"name":"test1"},{"$set":{"name":"test10"}})

执行完操作后,数据库如下图所示:

  • 更新全部数据
  1. collection.update_many({"name":"test2"},{"$set":{"name":"test20"}})

执行完操作后,数据库如下图所示:

  • 删除一条数据
  1. collection.delete_one({"name":"test3"})

执行完操作后,数据库如下图所示:

  • 删除所有满足条件的数据
  1. collection.delete_many({"name":"test4"})

执行完操作后,数据库如下图所示:

结语

  • 本篇主要介绍了MongoDB的聚合操作以及与Python的交互,但对于我目前的学习阶段来说,只用到了Python中的插入数据语句,其他的操作基本没有用到。
  • 感谢大家的阅读,有错误希望大家能够指出,我会积极改正。

MongoDB的聚合操作以及与Python的交互的更多相关文章

  1. Yii2的mongodb的聚合操作

    最近项目使用到mongodb的聚合操作,但是yii文档中对这方面资料较少,记录下 $where['created_time'] = ['$gt' => "$start_date_str ...

  2. MongoDB入门---聚合操作&管道操作符&索引的使用

    经过前段时间的学习呢,我们对MongoDB有了一个大概的了解,接下来就要开始使用稍稍深入一点的东西了,首先呢,就是MongoDB中的聚合函数,跟mysql中的count等函数差不多.话不多说哈,我们先 ...

  3. mongodb的聚合操作

    在mongodb中有时候我们需要对数据进行分析操作,比如一些统计操作,这个时候简单的查询操作(find)就搞不定这些需求,因此就需要使用  聚合框架(aggregation) 来完成.在mongodb ...

  4. mongodb aggregate 聚合 操作(扁平化flatten)

    mongodb自带的函数非常多,最近用mongo做持久化数据库,遇到一个需求:子文档是个数组,把数组里的各个字段扁平化合到根文档中,查过资料后(主要是mongodb的文档和stackoverflow) ...

  5. mongodb高级聚合查询

    在工作中会经常遇到一些mongodb的聚合操作,特此总结下.mongo存储的可以是复杂类型,比如数组.对象等mysql不善于处理的文档型结构,并且聚合的操作也比mysql复杂很多. 注:本文基于 mo ...

  6. mongodb高级聚合查询(转)

    在工作中会经常遇到一些mongodb的聚合操作,特此总结下.mongo存储的可以是复杂类型,比如数组.对象等mysql不善于处理的文档型结构,并且聚合的操作也比mysql复杂很多. 注:本文基于 mo ...

  7. mongodb 高级聚合查询

    mongodb高级聚合查询   在工作中会经常遇到一些mongodb的聚合操作,特此总结下.mongo存储的可以是复杂类型,比如数组.对象等mysql不善于处理的文档型结构,并且聚合的操作也比mysq ...

  8. mongodb(五):聚合操作(python)

    pymongo的聚合操作 数据类型样式 /* 1 */ { "_id" : ObjectId("5e5a32fe2a89d7c2fc05b9fc"), &quo ...

  9. MongoDB 聚合操作

    在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多台Server上并行执行复 ...

随机推荐

  1. jQuery轮播图(手动点击轮播)

    下面来看看最终做的手动点击轮播效果: 一.原理说明 (1)首先是轮播图的架构,我采用了一个最外边的大div包住两个小div,一个小div里面放四张图片,另一个小div里面放四个数字按钮 (2)对最外边 ...

  2. python学习笔记之——python模块

    1.python模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python ...

  3. 网络基础 Windows telnet使用简介及相关问题解决方案

    Windows telnet使用简介及相关问题解决方案 by:授客 QQ:1033553122 更改telnet的默认端口(23)(仅适用XP) 步骤: 进入cmd控制窗口 tlntadmn conf ...

  4. 让Oracle的 SHOW PARAMETER 命令显示隐藏参数

    转自 http://blog.csdn.net/staricqxyz/article/details/8624549 Find internal of "show parameter&quo ...

  5. ORACLE AUDIT 审计

    转自 http://blog.csdn.net/dnnyyq/article/details/4525980 1.什么是审计 审计(Audit)用于监视用户所执行的数据库操作,并且Oracle会将审计 ...

  6. CSS深入理解之float(HTML/CSS)

    float的设计初衷仅仅是:为了文字环绕效果 float的包裹与破坏 包裹:收缩.坚挺.隔绝(BFC) 破坏:父元素高度塌陷 <!DOCTYPE html> <html> &l ...

  7. The directory '/home/stone/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If execu

    使用sudo pip install ......的时候出现下面一段黄色的代码: The directory '/home/stone/.cache/pip/http' or its parent d ...

  8. C#关于微信昵称中存在的表情图标乱码解决

    //在获取微信用户信息时加密保存到数据库 System.Web.HttpUtility.UrlEncode("需要加密的字段") //前端在展示是解码 <script typ ...

  9. MsSQL使用加密连接SSL/TLS

    说明 应用程序通过未加密的通道与数据库服务器通信, 这可能会造成重大的安全风险.在这种情况下, 攻击者可以修改用户输入的数据, 甚至对数据库服务器执行任意 SQL 命令. 例如,当您使用以下连接字符串 ...

  10. 转:只能选择GridView中的一个CheckBox(单选CheckBox)

    方法1: protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e){CheckBox cbx = e.R ...