前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mongodb11天之屠龙宝刀(八)聚合函数与管道:sql与mongodb聚合函数对比

mongodb11天之屠龙宝刀(八)聚合函数与管道:sql与mongodb聚合函数对比

作者头像
学到老
发布于 2019-02-14 08:30:47
发布于 2019-02-14 08:30:47
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

mongodb11天之屠龙宝刀(八)聚合函数与管道:sql与mongodb聚合函数对比

原文连接:直通车

MongoDB 聚合

MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。

基本语法为:db.collection.aggregate( , , … )

现在在mycol集合中有以下数据:

代码语言:javascript
代码运行次数:0
运行
复制
{ "_id" : 1, "name" : "tom", "sex" : "男", "score" : 100, "age" : 34 }
{ "_id" : 2, "name" : "jeke", "sex" : "男", "score" : 90, "age" : 24 }
{ "_id" : 3, "name" : "kite", "sex" : "女", "score" : 40, "age" : 36 }
{ "_id" : 4, "name" : "herry", "sex" : "男", "score" : 90, "age" : 56 }
{ "_id" : 5, "name" : "marry", "sex" : "女", "score" : 70, "age" : 18 }
{ "_id" : 6, "name" : "john", "sex" : "男", "score" : 100, "age" : 31 }
1、$sum 计算总和。
代码语言:javascript
代码运行次数:0
运行
复制
 Sql:  select sex,count(*) from mycol group by sex

  MongoDb:  db.mycol.aggregate([{group: {_id: 'group: {_id: 'sex', personCount: {$sum: 1}}}])
代码语言:javascript
代码运行次数:0
运行
复制
  Sql:  select sex,sum(score) totalScore from mycol group by sex

  MongoDb:  db.mycol.aggregate([{group: {_id: 'group: {_id: 'sex', totalScore: {sum:′score'}}}])
2、$avg 计算平均值
代码语言:javascript
代码运行次数:0
运行
复制
   Sql:  select sex,avg(score) avgScore from mycol group by sex

  Mongodb: db.mycol.aggregate([{group: {_id: 'group: {_id: 'sex', avgScore: {avg:′score'}}}])
3、获取$max 最大值。
代码语言:javascript
代码运行次数:0
运行
复制
  Sql:  select sex,max(score) maxScore from mycol group by sex

  Mongodb: db.mycol.aggregate([{group: {_id: 'group: {_id: 'sex', maxScore : {max:′score'}}}])
4、$min 获取最小值。
代码语言:javascript
代码运行次数:0
运行
复制
  Sql:  select sex,min(score) minScore from mycol group by sex

  Mongodb: db.mycol.aggregate([{group: {_id: 'group: {_id: 'sex', minScore : {min:′score'}}}])
5、$push 把文档中某一列对应的所有数据插入值到一个数组中。
代码语言:javascript
代码运行次数:0
运行
复制
  Mongodb: db.mycol.aggregate([{group: {_id: 'group: {_id: 'sex', scores : {push:′score'}}}])
6、$addToSet 把文档中某一列对应的所有数据插入值到一个数组中,去掉重复的
代码语言:javascript
代码运行次数:0
运行
复制
  db.mycol.aggregate([{group: {_id: 'group: {_id: 'sex', scores : {addToSet:′score'}}}])
7、 $first 根据资源文档的排序获取第一个文档数据。
代码语言:javascript
代码运行次数:0
运行
复制
   db.mycol.aggregate([{group: {_id: 'group: {_id: 'sex', firstPerson : {first:′name'}}}])
8、 $last 根据资源文档的排序获取最后一个文档数据。
代码语言:javascript
代码运行次数:0
运行
复制
   db.mycol.aggregate([{group: {_id: 'group: {_id: 'sex', lastPerson : {last:′name'}}}])

9、全部统计 null

代码语言:javascript
代码运行次数:0
运行
复制
  db.mycol.aggregate([{group:{_id:null,totalScore:{group:{_id:null,totalScore:{push:'$score'}}}])
案例

  现在在t2集合中有以下数据:

代码语言:javascript
代码运行次数:0
运行
复制
  { "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" }

需求是统计出每个country/province下的userid的数量(同一个userid只统计一次)程如下。

代码语言:javascript
代码运行次数:0
运行
复制
db.t2.aggregate([ { group: {"_id": { "country" : "group: {"_id": { "country" : "country", "prov": "province"} , "number":{province"} , "number":{sum:1}} } ]) 

是错误的:

原因是,这样来统计不能区分userid相同的情况 (上面的数据中sh有两个 userid = a)

为了解决这个问题,首先执行一个group,其id 是 country, province, userid三个field:

代码语言:javascript
代码运行次数:0
运行
复制
db.t2.aggregate([ { group: {"_id": { "country" : "group: {"_id": { "country" : "country", "province": "province","uid":"userid" } } } ])

  可以看出,这步的目的是把相同的userid只剩下一个。

 然后第二步,再第一步的结果之上再执行统计:

代码语言:javascript
代码运行次数:0
运行
复制
db.t2.aggregate([ 
  { group: {"_id": { "country" : "group: {"_id": { "country" : "country", "province": "province","uid":"userid" } } } , 
  { group: {"_id": { "country" : "group: {"_id": { "country" : "_id.country", "province": "_id.province"  }, count : {_id.province"  }, count : {sum : 1 } } } 
  ])

  这回就对了

加入一个$project操作符,把_id去掉

代码语言:javascript
代码运行次数:0
运行
复制
 db.t2.aggregate([ { group: {"_id": { "country" : "group: {"_id": { "country" : "country", "province": "province","uid":"userid" } } } , 
  { group: {"_id": { "country" : "group: {"_id": { "country" : "_id.country", "province": "_id.province"  }, count: {_id.province"  }, count: {sum : 1 } } }, 
  { project : {"_id": 0, "country" : "project : {"_id": 0, "country" : "_id.country", "province" : "$_id.province", "count" : 1}} 
  ])

最终结果如下:

管道的概念

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

MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。

这里我们介绍一下聚合框架中常用的几个操作:

project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。match:用于过滤数据,只输出符合条件的文档。match:用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。match:用于过滤数据,只输出符合条件的文档。match:用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。 match:用于过滤数据,只输出符合条件的文档。match:用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。 limit:用来限制MongoDB聚合管道返回的文档数。

skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。 unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。

group:将集合中的文档分组,可用于统计结果。group:将集合中的文档分组,可用于统计结果。group:将集合中的文档分组,可用于统计结果。 sort:将输入文档排序后输出。

$geoNear:输出接近某一地理位置的有序文档。

1、$project实例

db.mycol.aggregate({$project:{name : 1, score : 1}})

这样的话结果中就只还有_id,name和score三个字段了,默认情况下_id字段是被包含的,如果要想不包含_id话可以这样:

代码语言:javascript
代码运行次数:0
运行
复制
db.mycol.aggregate({$project:{_id : 0, name : 1, score : 1}})

2、$match实例

  用于获取分数大于小于并且小于的记录,然后将符合条件的记录送到下一阶段match用于获取分数大于30小于并且小于100的记录,然后将符合条件的记录送到下一阶段group管道操作符进行处理

代码语言:javascript
代码运行次数:0
运行
复制
  db.mycol.aggregate([{match :{score: {match :{score: {gt: 30, lt: 100}}},{lt: 100}}},{group:{_id:'sex',count:{sex',count:{sum:1}}}]) 

更多复杂操作需要在实践中整理。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年11月01日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
MongoDB高级操作(管道聚合)
一、 聚合aggregate 聚合(aggerate)主要用于计算数据,类似于SQL中的sum(),avg(),聚合aggregate是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。 方法:db.stu.aggergate({管道:{表达式}}),如图:
全栈程序员站长
2022/11/01
3.4K0
MongoDB高级操作(管道聚合)
Python爬虫之mongodb的聚合操作
聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
海仔
2020/09/23
3K0
Python爬虫之mongodb的聚合操作
开心档-软件开发入门之MongoDB 聚合
MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。
iOS程序应用
2023/02/06
1.7K0
005.MongoDB索引及聚合
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。
木二
2019/07/01
2.3K0
[767]MongoDB聚合运算
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。
周小董
2020/02/29
1.8K0
MongoDB初级入门
{ "_id" : "Mary", "sum_age" : 75 } { "_id" : "Jack", "sum_age" : 66 } { "_id" : "zhengyunamei", "sum_age" : 0 } { "_id" : "Tom", "sum_age" : 120 } { "_id" : "陈加兵", "sum_age" : 22 } { "_id" : "Lucy", "sum_age" : 66 } { "_id" : "郑元梅", "sum_age" : 22 }
爱撒谎的男孩
2018/06/07
1.3K0
mongodb的用户登录认证和基本使用
连接: killall mongo mongo --host 127.0.0.1:27017 创建超级管理员 >use admin >db.createUser({ user:"wjb", pwd:"wjb123456", roles:[ { role:"userAdminAnyDatabase", db:"admin" } ] }) Successfully added user: {         "user" : "user",         "roles" : [                 {                         "role" : "dbOwner",                         "db" : "mydb"                 }         ] } > 如果 MongoDB 开启了权限模式,并且某一个数据库没有任何用户时,在不验证权限的情况下,可以创建一个用户,当继续创建第二个用户时,会返回错误,若想继续创建用户则必须登录,并且要先进入admin数据库。 PS:roles角色官网中分为built-in roles and user-defined roles Built-In Roles(内置角色): 1. 数据库用户角色:read、readWrite; 2. 数据库管理角色:dbAdmin、dbOwner、userAdmin; 3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager; 4. 备份恢复角色:backup、restore; 5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase 6. 超级用户角色:root   // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase) 7. 内部角色:__system 创建用户时可以在其数据库中创建,这样不用每次都进入admin数据库登录后再切换。如在数据库"mydb"创建用户"newwjb"。 use admin   db.auth("admin","admin")   创建新数据库 use test#创建新数据库   #查看所有数据库,没有看到test,插入一条数据才能看到 db.createUser(     {       user: "testwjb",       pwd: "testwjb",       roles: [ { role: "dbOwner", db: "test" } ]     }   )   db.auth("testwjb","testwjb")   db.wjbdb.insert({"name":"iamtest"}) show dbs#此时已看到test数据库 删除数据库 use test#切换当前数据库 db.dropDatabase() robomongo客户端软件连接: 地址:https://robomongo.org/download  user: "testwjb",pwd: "testwjb"连接即可 
拓荒者
2019/07/04
3.4K0
MongoDB 的安装和基本操作
示例:db.User.update({name:"lucy"}, {$set:{age:100, sex:0}})
用户7630333
2023/12/07
3050
MongoDB 的安装和基本操作
Mongoose: aggregate() 方法实现聚合函数
因为 $group 里面对应需要聚合操作的列必须写成 _id , 否则会出现 The field 'xxx' must be an accumulator object 的报错信息
szhshp
2022/09/21
3.9K0
MongoDB 中聚合统计计算 – $SUM表达式
我们一般通过表达式$sum来计算总和。因为MongoDB的文档有数组字段,所以可以简单的将计算总和分成两种:1,统计符合条件的所有文档的某个字段的总和;2,统计每个文档的数组字段里面的各个数据值的和。这两种情况都可以通过$sum表达式来完成。以上两种情况的聚合统计,分别对应与聚合框架中的 $group 操作步骤和 $project 操作步骤。
星哥玩云
2022/08/18
1.7K0
超实用!手把手入门 MongoDB:这些坑点请一定远离
1.创建数据库语法 如果数据库不存在,则指向数据库,但不创建(等待实际数据入库时创建),否则切换到指定数据库。
程序员小助手
2022/12/20
5.8K0
超实用!手把手入门 MongoDB:这些坑点请一定远离
MongoDB的聚合操作以及与Python的交互
上一篇主要介绍了MongoDB的基本操作,包括创建、插入、保存、更新和查询等,链接为MongoDB基本操作。 在本文中主要介绍MongoDB的聚合以及与Python的交互。
星哥玩云
2022/08/17
5.4K0
MongoDB的聚合操作以及与Python的交互
MongoDB 指令
可以看到,我们刚创建的数据库 test1 并不在数据库的列表中, 要显示它,我们需要向 test1 数据库插入一些数据。 插入数据
小手冰凉
2020/07/28
6.6K0
【mongoDB查询进阶】聚合管道(二) -- 阶段操作符
mongoDB有4类操作符用于文档的操作,例如find查询里面会用到的$gte,$in等。操作符以$开头,分为查询操作符,更新操作符,管道操作符,查询修饰符4大类。其中管道操作符是用于聚合管道中的操作符。
莫问今朝
2019/02/25
2.6K0
MongoDB 聚合管道(Aggregation Pipeline)
管道概念 POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为“管道”)方式,“数据元素”流串行地被一组线程按顺序执行。它的使用架构可参考下图: 以面向对象的思想去理解,整个流水
张善友
2018/01/29
2.9K0
MongoDB 聚合管道(Aggregation Pipeline)
MongoDB入门(四)
将记录按条件分组以后,然后再进行一系列操作,例如,求最大值、最小值、平均值,求和等操作。聚合操作还能够对记录进行复杂的操作,主要用于数理统计和数据挖掘。
传说之下的花儿
2023/11/26
4000
MongoDB入门(四)
MongoDB
​ MongoDB 是由 C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。
OY
2022/09/28
4.8K0
MongoDB
MongoDB 入门极简教程
安装 MongoDB Windowns、Ubuntu17.10 下安装 MongoDB教程在此MongoDB 帮助 要想获取命令列表,在 mongodb 客户端中输入 db.help():1> db.help() MongoDB 统计信息 要想获取 MongoDB 服务器的统计信息,在 mongodb 客户端中输入 db.stat(): 1 > db.stats() 创建数据库 use 命令 MongoDB 用 use + 数据库名称 的方式来创建数据库。 use 会创建一个新的数据库,如果该数据库存
KangVcar
2018/07/06
3.8K0
【翻译】MongoDB指南/聚合——聚合管道
【原文地址】https://docs.mongodb.com/manual/ 聚合 聚合操作处理数据记录并返回计算后的结果。聚合操作将多个文档分组,并能对已分组的数据执行一系列操作而返回单一结果。MongoDB提供了三种执行聚合的方式:聚合管道,map-reduce方法和单一目的聚合操作。 聚合管道 MongoDB的聚合框架模型建立在数据处理管道这一概念的基础之上。文档进入多阶段管道中,管道将文档转换为聚合结果。最基本的管道阶段类似于查询过滤器和修改输出文档形式的文档转换器。 其他的管道为分组和排序提供一些
甜橙很酸
2018/03/08
4.2K0
【翻译】MongoDB指南/聚合——聚合管道
Python | Python交互之mongoDB交互详解
本篇为mongodb篇,包含实例演示,mongodb高级查询,mongodb聚合管道,python交互等内容。
咸鱼学Python
2019/10/09
8.1K0
相关推荐
MongoDB高级操作(管道聚合)
更多 >
目录
  • MongoDB 聚合
    • 1、$sum 计算总和。
    • 2、$avg 计算平均值
    • 3、获取$max 最大值。
    • 4、$min 获取最小值。
    • 5、$push 把文档中某一列对应的所有数据插入值到一个数组中。
    • 6、$addToSet 把文档中某一列对应的所有数据插入值到一个数组中,去掉重复的
    • 7、 $first 根据资源文档的排序获取第一个文档数据。
    • 8、 $last 根据资源文档的排序获取最后一个文档数据。
  • 案例
  • 管道的概念
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档