MongoDB的聚合函数 Aggregate
Aggregate的使用,有利于我们对MongoDB中的集合进行进一步的拆分。
示例:
- db.collection.aggregate(
- {$match:{x:1},
- {limit:10},
- {$group:{_id:"$age"}}}
- );
操作符介绍:
$project:包含、排除、重命名和显示字段
$match:查询,需要同find()一样的参数
$limit:限制结果数量
$skip:忽略结果的数量
$sort:按照给定的字段排序结果
$group:按照给定表达式组合结果
$unwind:分割嵌入数组到自己顶层文件
============================================================
这是MongoDB官网上的一个Data Model:
- {
- "_id": "10280",//zipcode
- "city": "NEW YORK",//城市
- "state": "NY",//城市缩写
- "pop": 5574,//人口
- "loc": [ //经纬度
- -74.016323,
- 40.710537
- ]
- }
1、查出一个超过1千万人口的城市
- db.zipcodes.aggregate(
- {$group:{_id:"$state", totalPop:{$sum:"$pop"}},
- {$match:{totalPop:{$gte:10000000}}}
- );
上面的语句相当于: SELECT state, sum(pop) totalPop from zipcodes group by state having by totalPop >= 10000000;
分析:
$group主要是用于分组,其中_id是用组的类型集合,totalPop是生成的一个新的字段,用于存储总数。
其实,document经过$group之后,系统会为其生成一个新的document(新的documment为{"_id":"AK","totalPop":550043}),这在下面的例子中,我们会看得更清楚。
$match,相当于为新生成的document提供查询功能
2、求平均人口,每个state
- db.zipcodes.aggregate( { $group :
- { _id : { state : "$state", city : "$city" },
- pop : { $sum : "$pop" } } },
- { $group :
- { _id : "$_id.state",
- avgCityPop : { $avg : "$pop" } } } )
上述示例中出现了两个$group,那是什么含义呢?
第一个$group是将原来的zipcodes 这个 document变成新的,如:
- {
- "_id" : {
- "state" : "CO",
- "city" : "EDGEWATER"
- },
- "pop" : 13154
- }
第二个 $group是在,原有的基础之上,再进行一次重新格式化数据,再生成新的document,如:
- {
- "_id" : "MN",
- "avgCityPop" : 5335
- },
3、查询每个州人口最大和最小的城市
- db.zipcodes.aggregate(
- {$group:{_id:{state:"$state",city:"$city"}, totalPop:{$sum:"$pop"}}},//统计州的所有人,生成一个新的文档,是关于州与其总人口
- {$sort:{"totalPop":-1}},//对新文档,根据人口数倒序排序
- {$group:{_id:"$_id.state",
- "biggestCity":{$first:"$_id.city"},//最大人口的城市
- "biggestPop":{$first:"totalPop"},//最大人口的数量
- "smallestCity":{$last:"$_id.city"},
- "smallestPop":{$last:"totalPop"}
- }},//重新组成一个新的文件,包含,州名,最大人口数和最小人口数
- //本来结构到此基本上差不多了
- //但我们需要再对数据进行格式化
- {$project:
- {_id:0,
- state:"$_id",
- biggestCity:{name:"$biggestCity",pop:"$biggestPop"},
- smallestCity:{name:"$smallestCity",pop:"$smallestPop"}
- }
- }
- );
数据结构,如下:
- {
- "state" : "RI",
- "biggestCity" : {
- "name" : "CRANSTON",
- "pop" : 176404
- },
- "smallestCity" : {
- "name" : "CLAYVILLE",
- "pop" : 45
- }
- }
MongoDB的聚合函数 Aggregate的更多相关文章
- 聚合函数 Aggregate Function
聚合函数是用来统计每个分组的统计信息,它们要跟 group by 一起使用,用来将每个分组所有数据 聚合 成一条统计数据. 包括 max/min/count/avg/sum 等. -- 按照部门进行分 ...
- MongoDB中聚合工具Aggregate等的介绍与使用
Aggregate是MongoDB提供的众多工具中的比较重要的一个,类似于SQL语句中的GROUP BY.聚合工具可以让开发人员直接使用MongoDB原生的命令操作数据库中的数据,并且按照要求进行聚合 ...
- C#操作mongodb(聚合函数)-分组找出每组的最大值
public static void OnQuery_QXData(string DBName, string tablename,string layername) { ...
- 【Mongodb】聚合查询 && 固定集合
概述 数据存储是为了可查询,统计.若数据只需存储,不需要查询,这种数据也没有多大价值 本篇介绍Mongodb 聚合查询(Aggregation) 固定集合(Capped Collections) 准备 ...
- MongoDB 聚合函数
概念 聚合函数是对一组值执行计算并返回单一的值 主要的聚合函数 count distinct Group MapReduce 1.count db.users.count() db.users.cou ...
- MongoDB 聚合函数及排序
聚合函数 最大值 $max db.mycol.aggregate([{$group : {_id : "$by_user", num_max : {$max: "$li ...
- mongodb聚合查询-aggregate
Mongodb-aggregate 在工作中经常遇到一些mongodb的聚合操作,和mysql对比起来,mongo存储的可以是复杂的类型,比如数组,字典等mysql不善于处理的文档型结构,但是mong ...
- Mongodb学习笔记四(Mongodb聚合函数)
第四章 Mongodb聚合函数 插入 测试数据 ;j<;j++){ for(var i=1;i<3;i++){ var person={ Name:"jack"+i, ...
- 在MongoDB中实现聚合函数 (转)
随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加.这使得很多组织都在寻找一种经济的 ...
随机推荐
- [web] [vscode] 自定义语言缩进
vscode 默认的html 语言的缩进有点过,貌似一个tab6个space, html看起来太空了,所幸的是可以自己调整单个语言的缩进模式. 方法如下 Preferences: Open User ...
- Ubuntu的Unable to locate package无法更新源问题解决方案
https://blog.csdn.net/long19910605/article/details/47017889/ 问题: 更新源时提示不能联网(does the network require ...
- [.net 多线程 ]ReaderWriterLock
ReaderWriterLock 用于同步对资源的访问.在任一特定时刻,它允许多个线程同时进行读访问,或者允许单个线程进行写访问.在资源不经常发生更改的情况下,ReaderWriterLock 所提供 ...
- 十、Node.js-url模块
下面使用之前提到过的note交互模式(可以在cmd直接执行js代码)进行学习url模块 跳出note模式同样是Ctrl+C(两次) 学习url模块主要是要掌握url模块的方法: url.parse() ...
- C# LINQ(6)
目前说了 select group...by where from join on equal 这几个关键字,如果经过练习,熟练使用这几个关键字,大部分的LINQ查询基本都是可以完成的. 今天说一下l ...
- win10 + Lubuntu 双系统安装
win10 + Lubuntu 双系统安装 最近重装了系统,索性直接安装win10 + Lubuntu 双系统,便于在物理机下进行 Linux开发. 这里我选择的 Linux 发行版是 Lubuntu ...
- 【bzoj4832】[Lydsy1704月赛]抵制克苏恩 期望dp
Description 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q 同学会告诉你所有相关的细节.炉石传说是这样的一个游戏,每个玩家拥有一个 ...
- 【python】Python任务调度模块 – APScheduler
APScheduler是一个Python定时任务框架,使用起来十分方便.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以持久化任务.并以daemon方式运行应用.目前最新版本为3.0 ...
- 【python】10分钟教你用Python做个打飞机小游戏超详细教程
更多精彩尽在微信公众号[程序猿声] 我知道你们一定想先看效果如何 00 目录 整体框架 开始之前-精灵类Sprite 子弹类class Bullet 玩家飞机类class Player 敌机类clas ...
- flink学习笔记-flink实战
说明:本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKh ...