2019独角兽企业重金招聘Python工程师标准>>>

MongoDB聚合(二)2.3 $group
$group操作可以将文档根据给定字段的不同值进行分组。
如果选定了需要分组的字段,可以将选定的字段传递给"$group"函数的"_id"字段。
{ "$group" : {"_id" : "$day"} }
{ "$group" : {"_id" : "$grade"} }
{ "$group" : {"_id" : {"state" : "$state", "city" : "$city"}} }
2.3.1 分组操作符
允许对每个分组进行计算,得到相应的结果。
2.3.2 算术操作符
两个操作符用于对数值类型的字段的值进行计算:"$sum"和"$average"。
"$sum",对于分组中的每个文档,将value与计算结果相加。
例如:
插入测试数据:
countrys = ["china", "japan", "germany", "canada", "india"]
for (var i = 1; i < 100; i ++) {name = countrys[Math.floor(Math.random() * countrys.length)]money =  Math.floor(1000 * Math.random())db.foo.insert({"country" : name, "_id" : i, "money" : money})
}
分组:
db.foo.aggregate(
{"$group" : {"_id" : "$country","total" : {"$sum" : "$money"}}
})
返回结果:
{ "_id" : "canada", "total" : 11316 }
{ "_id" : "china", "total" : 7225 }
{ "_id" : "india", "total" : 11190 }
{ "_id" : "germany", "total" : 10288 }
{ "_id" : "japan", "total" : 9330 }
$avg,返回每个分组的平均值。
例如:
聚合:
db.foo.aggregate(
{"$group" : {"_id" : "$country","average" : {"$avg" : "$money"}}
})
返回结果:
{ "_id" : "canada", "average" : 595.578947368421 }
{ "_id" : "china", "average" : 481.6666666666667 }
{ "_id" : "india", "average" : 559.5 }
{ "_id" : "germany", "average" : 411.52 }
{ "_id" : "japan", "average" : 466.5 }
2.3.3 极值操作符
极值操作符获取数据集合的边缘值。
"$max" : expr
返回最大值。
"$min" : expr
返回最小值。
"$first" : expr
返回分组第一个值。
"$last" : expr
返回分组最后一个值。
"$max"和"$min"会查看文档没一个值。
例如:
db.foo.aggregate(
{"$group" : {"_id" : "$country","lowest" : {"$min" : "$money"},"highest" : {"$max" : "$money"},}
})
返回结果:
{ "_id" : "canada", "lowest" : 130, "highest" : 950 }
{ "_id" : "china", "lowest" : 15, "highest" : 949 }
{ "_id" : "india", "lowest" : 98, "highest" : 994 }
{ "_id" : "germany", "lowest" : 36, "highest" : 960 }
{ "_id" : "japan", "lowest" : 28, "highest" : 850 }
如果结果集是有序的,则使用"$first"和"$last"操作。
例如:
插入测试数据:
for (var i = 1; i < 100; i++) {name = "caoqing",age = idb.foo1.insert({"name" : name, "age" : age})
}
聚合:
db.foo1.aggregate(
{"$group" : {"_id" : "$name","lowest" : {"$first" : "$age"},"highest" : {"$last" : "$age"},    }
}
)
查询结果:
{ "_id" : "caoqing", "lowest" : 1, "highest" : 99 }
2.3.4 数组操作符
对数组进行操作。
"$addToSet" : expr
如果当前数组不包含expr,则添加。返回结果集中,每个元素最多出现一次。
"$push" : expr
添加expr到数组,返回包含所有值的数组。
2.3.5 分组行为
大多数操作符都是流式工作的,只要有新文档进入,就可以处理,但是"$group"必须等到收入所有文档后,才能分组,然后将分组发送给管道中的下一操作符。
在分片情况下,"$group"先在每个分片上执行,然后把分组结果发送到mongos再进行统一分组,剩余的管道操作也都是在mongos上运行的。2.4 $unwind
拆分可以将数组的每一个值拆分为单独的文档。
例如:
db.blog.insert({"auther" : "caoqing","comments" : [{"CEO" : "Bill Gates","corp" : "MicroSoft"},{"CEO" : "Mark Zuckerberg","corp" : "Facebook"},{"CEO" : "Dick Costolo","corp" : "Twitter"}]
})
拆分:
db.blog.aggregate(
{"$unwind" : "$comments"
})
结果:
{ "_id" : ObjectId("5360c4f909e603f892b1457c"), "auther" : "caoqing", "comments" : { "CEO" : "Bill Gates", "corp" : "MicroSoft" } }
{ "_id" : ObjectId("5360c4f909e603f892b1457c"), "auther" : "caoqing", "comments" : { "CEO" : "Mark Zuckerberg", "corp" : "Facebook" } }
{ "_id" : ObjectId("5360c4f909e603f892b1457c"), "auther" : "caoqing", "comments" : { "CEO" : "Dick Costolo", "corp" : "Twitter" } }
如果希望得到特定的子文档,可以先拆分,再"$match"得到结果。
db.blog.aggregate(
{"$project" : {"comments" : "$comments"}},{"$unwind" : "$comments"},{"$match" : {"comments.CEO" : "Mark Zuckerberg"}}
)
结果:
{ "_id" : ObjectId("5360c4f909e603f892b1457c"), "comments" : { "CEO" : "Mark Zuckerberg", "corp" : "Facebook" } }2.5 $sort
可以根据任意字段或多个字段进行排序。如果需要大量排序,最好在管道的第一阶段进行排序,这时可以使用索引。否则排序会很慢,占用大量内存。
例如:
db.foo.aggregate(
{"$group" : {"_id" : "$country","total" : {"$sum" : "$money"}}},{"$sort" : {"total" : -1, "country" : 1}}
)
结果:
{ "_id" : "canada", "total" : 11316 }
{ "_id" : "india", "total" : 11190 }
{ "_id" : "germany", "total" : 10288 }
{ "_id" : "japan", "total" : 9330 }
{ "_id" : "china", "total" : 7225 }2.6 $limit
$limit接受一个参数n,返回结果集中前n个文档。
例如:
db.foo.aggregate(
{"$group" : {"_id" : "$country","total" : {"$sum" : "$money"}}},{"$sort" : {"total" : -1, "country" : 1}},{"$limit" : 3}
)
结果:
{ "_id" : "canada", "total" : 11316 }
{ "_id" : "india", "total" : 11190 }
{ "_id" : "germany", "total" : 10288 }2.7 $skip
$skip接受一个参数n,丢弃结果集中前n个文档,将剩余文档返回。如果需要丢弃大量数据,效率会很低。
例如:
db.foo.aggregate(
{"$group" : {"_id" : "$country","total" : {"$sum" : "$money"}}},{"$sort" : {"total" : -1, "country" : 1}},{"$skip" : 2}
)
结果:
{ "_id" : "germany", "total" : 10288 }
{ "_id" : "japan", "total" : 9330 }
{ "_id" : "china", "total" : 7225 }2.8 使用管道
应该在管道开始阶段(执行"$project", "$group", "$unwind"操作前)将尽可能多的文档和字段过滤掉,管道如果不是直接从原来的集合中使用数据,就无法在筛选和排序过程中使用索引。
Mongodb不允许单一的聚合操作占用过多的内存,如果某个操作占用20%以上内存,操作会直接输出错误。
可以将结果集放入一个集合方便以后调用。

转载于:https://my.oschina.net/u/1449160/blog/228953

MongoDB聚合(二)相关推荐

  1. MongoDB 聚合操作

    MongoDB 聚合操作 在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多 ...

  2. limit mongodb 聚合_mongodb-$type、limit、skip、sort方法、索引、聚合

    一.$type操作符 $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果. MongoDB 中可以使用的类型如下表所示: 类型数字备注 Double 1 String 2 Obj ...

  3. MongoDB 聚合管道(Aggregation Pipeline)

    管道概念 POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为"管道")方式,"数据元素"流串行地被一组线程按顺序执行.它的使用架构可参考 ...

  4. MongoDB聚合查询 Pipeline 和 MapReduce

    MongoDB聚合查询 MongoDB聚合查询 什么是聚合查询 Pipeline聚合管道方法 聚合流程 详细流程 聚合语法 常用聚合管道 $count $group $match $unwind $p ...

  5. MongoDB聚合查询

    MongoDB高手课_MongoDB_NoSQL-极客时间极客时间推出的MongoDB高手课是帮助互联网从业者学习MongoDB.NoSQL的在线课程,极客时间是面向IT领域的知识服务产品,致力于帮助 ...

  6. MongoDB 聚合

    聚合操作过程中的数据记录和计算结果返回.聚合操作分组值从多个文档,并可以执行各种操作,分组数据返回单个结果.在SQL COUNT(*)和group by 相当于MongoDB的聚集. aggregat ...

  7. MongoDB 教程二: 添加, 删除,查询 shell命令

    视频:MongoDB 教程二: 添加, 删除,查询 shell命令 MongoDB Shell 常用操作命令 MonoDB   shell命令操作语法和JavaScript很类似,其实控制台底层的查询 ...

  8. mongodb 聚合框架_如何使用MongoDB的聚合框架处理高级数据处理

    mongodb 聚合框架 MongoDB has come a long way. Even though there are many NoSQL databases out there, Mong ...

  9. 7-5 日期问题面向对象设计(聚合二) (40 分)

    ** 7-5 日期问题面向对象设计(聚合二) (40 分) ** 参考题目7-3的要求,设计如下几个类:DateUtil.Year.Month.Day,其中年.月.日的取值范围依然为:year∈[18 ...

最新文章

  1. ASA 过滤 URL (图解)
  2. NHibernate 3.0在PetShop 3层架构中的应用 系列
  3. Wireshark网络抓包(一)——数据包、着色规则和提示
  4. BugkuCTF-Reverse题love
  5. 二、ElasticSearch内置分词器
  6. C++/C--多个vector拼接的方法【转载】
  7. 计算机加工的过程和类型,3.1.2计算机信息加工的过程和类型
  8. 【算法笔记+HDU2222】AC自动机(统计一个长字符串由多少个不同的短字符串组成)
  9. linux 下tar打包举例,Linux tar打包命令
  10. 倾斜摄影数据OSGB进入到ArcGIS平台相关问题小结
  11. 2022年11月信息系统项目管理师考试论文相关内容预测
  12. input 输入法禁用
  13. css ul1,CSS 列表样式 ul
  14. 第一次QMK编译记录(11.26)
  15. 友善串口工具 电子秤_Serial Port Utility
  16. 极海单片机串口调试记录
  17. 一个北大毕业生决定去送外卖
  18. clip-path应用
  19. matlab绘制分段函数,二维函数
  20. 钟汉良日记:凡夫俗子一定要眼见为实,菩萨才能见因知果!

热门文章

  1. sql server 小技巧(8) visual studio 2013里使用Sql server compact 4.0及发布问题处理
  2. 我的gentoo安装纪念贴移植空间版
  3. Iframe的高级操作
  4. ZedGraph webform 初学小例子 (代码有详细解释)
  5. python获取月份字符串_python 时间字符串与日期转化
  6. docker的php教程https,Docker搭建php环境教程详解
  7. react打包成html5,create-react-app项目打包相关问题
  8. java连接redis不稳定_java相关:jedispool连redis高并发卡死的问题
  9. 组建一个局域网一般会用到哪些设备_朋友私信一个简单的问题:端口和网关到底有什么区别?...
  10. 新建oracle数据库 环境查询,Oracle单实例数据库迁移到Oracle RAC 环境之(2)--实施篇...