MongoDB二个主要的操作:一个是查询,另一个是统计。对于查询而言,主要是find()方法,再配合Filters组合多个查询条件

对于统计而言,则主要是aggregate操作,比如 group、sum、avg、project、match……

aggregate可以将上述操作组织成 pipeline 形式,依次经过各种操作处理。

本文是MongoDB University M101的课程笔记,主要记录:MongoDB aggregate的一些常用操作。

参考资料:sql to aggregation mapping chart

①project

它是个1:1的操作,即一个Document输入给project处理,输出一个新的Document。它主要对Key进行处理(大小写转换、删除原来Document某些Key……)

比如原Document如下:

{
"city" : "ACMAR",
"loc" : [
-86.51557,
33.584132
],
"pop" : 6055,
"state" : "AL",
"_id" : "35004"
}

想把它变成:

{
"city" : "acmar",
"pop" : 6055,
"state" : "AL",
"zip" : "35004"
}

使用:project操作符进行处理:

db.zips.aggregate([
{$project:{_id:0, city:{$toLower:"$city"}, pop:1, state:1, zip:"$_id"}}
])
_id:0  去掉原Document中的_id字段;city:{$ toLower:"$city"}   对原Document中的 "$city" 的值全部转换成小写,赋给新city字段

pop:1  state:1  表示将原Document中的 pop 字段、state 字段 放到新Document中

zip:"$_id" 将原Document中的 '_id'字段值  赋值给 新的 "zip" 字段  

②group avg,根据分组求平均值。比如某个Document格式如下:对 state字段进行分组,求每个state的人口(pop)的平均值

{
"city" : "FISHERS ISLAND",
"loc" : [
-72.017834,
41.263934
],
"pop" : 329,
"state" : "NY",
"_id" : "06390"
}
db.zips.aggregate([
{"$group":{"_id":"$state", "average_pop":{"$avg":"$pop"}}}
])

$group表示分组操作,执行该操作后会生成一个新Document。

_id:$state 表示对 $state 字段进行分组,生成的新Document的 _id 为 state的值
"$avg":"$pop" 表示对原Document中的 “pop”字段按 $state 分组求平均值。得到的平均值为 "average_pop"字段的值。

最终的结果如下:

{ "_id" : "NY", "average_pop" : 9705.34 }
{ "_id" : "CT", "average_pop" : 13226.48 }
{ "_id" : "CA", "average_pop" : 19067.72 }
{ "_id" : "NJ", "average_pop" : 16949.9 }

③match

Document示例如下:想要过滤人口字段(pop)大于100 000 的所有记录。

{
"city" : "ACMAR",
"loc" : [
-86.51557,
33.584132
],
"pop" : 6055,
"state" : "AL",
"_id" : "35004"
}
db.zips.aggregate([
{$match:{
pop:{$gt:100000}
}
}
])

$match表示对 Document进行过滤

pop:{$gt:100000} 表示根据 pop 字段过滤,过滤的条件为 pop 的值大于100000

④sort

Document示例如下,现在需要对 state 和 city 这两个字段进行升序排序。

{
"city" : "ACMAR",
"loc" : [
-86.51557,
33.584132
],
"pop" : 6055,
"state" : "AL",
"_id" : "35004"
}
db.zips.aggregate( [ { $sort:{state:1, city:1} } ] )

返回结果如下:

{ "_id" : "95915", "city" : "BELDEN", "loc" : [ -121.325924, 39.921746 ], "pop" : 32, "state" : "CA" }
{ "_id" : "90706", "city" : "BELLFLOWER", "loc" : [ -118.126527, 33.886676 ], "pop" : 61650, "state" : "CA" }
{ "_id" : "93430", "city" : "CAYUCOS", "loc" : [ -120.890791, 35.444606 ], "pop" : 3384, "state" : "CA" }
{ "_id" : "96107", "city" : "COLEVILLE", "loc" : [ -119.482784, 38.502903 ], "pop" : 1370, "state" : "CA" }

⑤group、sort、first

Document示例如下,现在要寻找,每个州(state)下的 每个城市(city)人口的最大值。

{ "_id" : "07840", "city" : "HACKETTSTOWN", "loc" : [ -74.834315, 40.852891 ], "pop" : 23440, "state" : "NJ" }
{ "_id" : "93254", "city" : "NEW CUYAMA", "loc" : [ -119.823806, 34.996709 ], "pop" : 80, "state" : "CA" }
{ "_id" : "92278", "city" : "TWENTYNINE PALMS", "loc" : [ -116.06041, 34.237969 ], "pop" : 11412, "state" : "CA" }
{ "_id" : "08536", "city" : "PLAINSBORO", "loc" : [ -74.568836, 40.332432 ], "pop" : 13008, "state" : "NJ" }
{ "_id" : "06117", "city" : "W HARTFORD", "loc" : [ -72.745689, 41.790021 ], "pop" : 14774, "state" : "CT" }
{ "_id" : "06071", "city" : "SOMERS", "loc" : [ -72.458266, 41.997813 ], "pop" : 9685, "state" : "CT" }
{ "_id" : "92070", "city" : "SANTA YSABEL", "loc" : [ -116.69635, 33.147579 ], "pop" : 1263, "state" : "CA" }
{ "_id" : "91941", "city" : "LA MESA", "loc" : [ -117.011541, 32.760431 ], "pop" : 42536, "state" : "CA" }
{ "_id" : "06705", "city" : "WATERBURY", "loc" : [ -72.996268, 41.550328 ], "pop" : 25128, "state" : "CT" }
{ "_id" : "07750", "city" : "MONMOUTH BEACH", "loc" : [ -73.98089, 40.333032 ], "pop" : 3329, "state" : "NJ" }
{ "_id" : "06095", "city" : "WINDSOR", "loc" : [ -72.663893, 41.856122 ], "pop" : 27815, "state" : "CT" }
{ "_id" : "06702", "city" : "WATERBURY", "loc" : [ -73.038545, 41.556568 ], "pop" : 4522, "state" : "CT" }
{ "_id" : "13833", "city" : "SANITARIA SPRING", "loc" : [ -75.790978, 42.195735 ], "pop" : 4777, "state" : "NY" }
{ "_id" : "95363", "city" : "PATTERSON", "loc" : [ -121.140732, 37.490592 ], "pop" : 13437, "state" : "CA" }

第一步:统计每个州下每个城市的人口总和:

db.zips.aggregate( [ 
{ $group:
{_id:{state:"$state",city:"$city"},
population:{$sum:"$pop"}}
}
] )

得到如下Document:(注意Document的 _id 变化)

{ "_id" : { "state" : "NJ", "city" : "ISLAND HEIGHTS" }, "population" : 1470 }
{ "_id" : { "state" : "NY", "city" : "REDWOOD" }, "population" : 1735 }
{ "_id" : { "state" : "CT", "city" : "TAFTVILLE" }, "population" : 2538 }
{ "_id" : { "state" : "CT", "city" : "ELLINGTON" }, "population" : 9070 }
{ "_id" : { "state" : "CT", "city" : "STORRS MANSFIELD" }, "population" : 16117 }
{ "_id" : { "state" : "NJ", "city" : "MERCHANTVILLE" }, "population" : 22294 }
{ "_id" : { "state" : "NJ", "city" : "STRATHMERE" }, "population" : 163 }
{ "_id" : { "state" : "CA", "city" : "LA JOLLA" }, "population" : 40399 }
{ "_id" : { "state" : "NY", "city" : "HURLEYVILLE" }, "population" : 3303 }
{ "_id" : { "state" : "NJ", "city" : "NORTH BRANCH" }, "population" : 34212 }
{ "_id" : { "state" : "NJ", "city" : "WEEHAWKEN" }, "population" : 69646 }
{ "_id" : { "state" : "NJ", "city" : "MANALAPAN" }, "population" : 28928 }
{ "_id" : { "state" : "NY", "city" : "NEW YORK" }, "population" : 8190 }
{ "_id" : { "state" : "NY", "city" : "DEWITTVILLE" }, "population" : 1159 }
{ "_id" : { "state" : "NY", "city" : "QUEENSBURY" }, "population" : 15023 }
....
....

按state 对人口进行排序

db.zips.aggregate( [ 
{ $group:{_id:{state:"$state",city:"$city"}, population:{$sum:"$pop"}} },
{$sort:{"_id.state":1, "population":-1}}
] )

得到如下Document:

{ "_id" : { "state" : "CA", "city" : "LOS ANGELES" }, "population" : 104702 }
{ "_id" : { "state" : "CA", "city" : "LA MESA" }, "population" : 66480 }
{ "_id" : { "state" : "CA", "city" : "SHORE ACRES" }, "population" : 64053 }
{ "_id" : { "state" : "CA", "city" : "BELLFLOWER" }, "population" : 61650 }
{ "_id" : { "state" : "CA", "city" : "VISALIA" }, "population" : 51620 }
{ "_id" : { "state" : "CA", "city" : "SAN DIEGO" }, "population" : 45487 }
{ "_id" : { "state" : "CA", "city" : "GOLD RIVER" }, "population" : 42461 }
....
....

然后,再对 state 进行 group by,使用 $first 取第一条记录:就是这个州下 的人口最大的城市(city).

first 一般和 group使用:$group得到一组Document后,使用 $first 获取该组Documents中的第一个Document。

 db.zips.aggregate([ 
{
$group:{_id:{state:"$state",city:"$city"},
population:{$sum:"$pop"}
}
},
{$sort:{"$_id.state":1, "population":-1}},
{$group:{_id:"_id.state",
city:{$first:"$_id.city"},
population:{$first:"$population"}
}
}
])

得到:

{ "_id" : "NJ", "city" : "JERSEY CITY", "population" : 100756 }
{ "_id" : "NY", "city" : "FLUSHING", "population" : 51947 }
{ "_id" : "CT", "city" : "BRISTOL", "population" : 60670 }
{ "_id" : "CA", "city" : "LOS ANGELES", "population" : 104702 }

最后再对 _id 排序

 db.zips.aggregate( [ 
{ $group:{_id:{state:"$state",city:"$city"},
population:{$sum:"$pop"}} },
{$sort:{"_id.state":1, "population":-1}},
{$group:{_id:"$_id.state",city:{$first:"$_id.city"},population:{$first:"$population"}}},
{$sort:{"_id":1}}
] )

得到:

{ "_id" : "CA", "city" : "LOS ANGELES", "population" : 104702 }
{ "_id" : "CT", "city" : "BRISTOL", "population" : 60670 }
{ "_id" : "NJ", "city" : "JERSEY CITY", "population" : 100756 }
{ "_id" : "NY", "city" : "FLUSHING", "population" : 51947 }

Mongodb aggregation 基本操作示例的更多相关文章

  1. mongodb的基本操作与插入文档(document)

    一.mongodb的基本操作: 1.查看mongodb当前所有的databases : show dbs 2.选择数据库(database) : use databaseName(该数据库不存在则会自 ...

  2. Node.js与MongoDB的基本连接示例

    Node.js与MongoDB的基本连接示例 前提 已经安装了node.js和MongoDB,本文使用的node.js是v0.12.0,MongoDB是3.0.0. 初始化数据 启动MongoDB服务 ...

  3. 【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

    [网络爬虫入门05]分布式文件存储数据库MongoDB的基本操作与爬虫应用 广东职业技术学院  欧浩源 1.引言 网络爬虫往往需要将大量的数据存储到数据库中,常用的有MySQL.MongoDB和Red ...

  4. MongoDB之基本操作与日常维护

    MongoDB基本操作 MongoDB的基本操作主要是对数据库.集合.文档的操作,包括创建数据库.删除数据库.插入文档.更改文档.删除文档.和查询文档. 操作 描述 show dbs 查看当前实例下的 ...

  5. 孤荷凌寒自学python第六十六天学习mongoDB的基本操作并进行简单封装5

    孤荷凌寒自学python第六十六天学习mongoDB的基本操作并进行简单封装5并学习权限设置 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十二天. 今天继续学习mongo ...

  6. 孤荷凌寒自学python第六十五天学习mongoDB的基本操作并进行简单封装4

    孤荷凌寒自学python第六十五天学习mongoDB的基本操作并进行简单封装4 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十一天. 今天继续学习mongoDB的简单操作 ...

  7. 孤荷凌寒自学python第六十四天学习mongoDB的基本操作并进行简单封装3

    孤荷凌寒自学python第六十四天学习mongoDB的基本操作并进行简单封装3 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十天. 今天继续学习mongoDB的简单操作, ...

  8. 孤荷凌寒自学python第六十三天学习mongoDB的基本操作并进行简单封装2

    孤荷凌寒自学python第六十三天学习mongoDB的基本操作并进行简单封装2 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第九天. 今天继续学习mongoDB的简单操作, ...

  9. 孤荷凌寒自学python第六十二天学习mongoDB的基本操作并进行简单封装1

    孤荷凌寒自学python第六十二天学习mongoDB的基本操作并进行简单封装1 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第八天. 今天开始学习mongoDB的简单操作, ...

随机推荐

  1. 全局变量 static变量

    变量 作用域 全局变量( external linkage ) 定义在函数外 Int a=1 作用于整个工程 在连接两个文件时若有两个a会报错 Staic 函数外(internal linkage) ...

  2. 安装Ubuntu Server18.04(附与CentOS占用体积和Python版本的对比)

    这边只演示一下最新系统的安装过程,设置之类的和以前讲的Kali以及CentOS大同小异:https://www.cnblogs.com/dunitian/p/4822808.html#linux 和C ...

  3. Ubuntu 18.04 安装微信(Linux通用)

    Linux相关的知识:https://www.cnblogs.com/dunitian/p/4822808.html#linux 新增谷歌浏览器添加到桌面的彻底删除:https://www.cnblo ...

  4. 使用python简单连接并操作数据库

    python中连接并操作数据库 图示操作流程 一.使用的完整流程 # 1. 导入模块 from pymysql import connect # 2. 创建和数据库服务器的连接,自行设置 服务器地址, ...

  5. 51Nod--1295 XOR key (可持久化tire树)

    题目链接 1295 XOR key 可持久化tire树模版题 数组一定要开够 不然数组不够的话就容易tle 吃了两次亏 #include<bits/stdc++.h> using name ...

  6. CF1153F Serval and Bonus Problem

    Serval and Bonus Problem 1.转化为l=1,最后乘上l 2.对于一个方案,就是随便选择一个点,选在合法区间内的概率 3.对于本质相同的所有方案考虑在一起,贡献就是合法区间个数/ ...

  7. poj2054 Color a Tree

    神题.这题是巨毒瘤... 自己写真可谓是: 排空驭气奔如电,上天入地求之遍 上穷碧落下黄泉,两处茫茫皆不见 由于我们知道:不是树形时,不停选值最大的节点可以得到最小代价. 那么我们就能想出一个错误的贪 ...

  8. 第六节,TensorFlow编程基础案例-保存和恢复模型(中)

    在我们使用TensorFlow的时候,有时候需要训练一个比较复杂的网络,比如后面的AlexNet,ResNet,GoogleNet等等,由于训练这些网络花费的时间比较长,因此我们需要保存模型的参数. ...

  9. struts2 contextMap

    一.contextMap中的数据操作 root根:List 元素1 元素2 元素3 元素4 元素5 contextMap:Map key value application Map key value ...

  10. IntelliJ IDEA配置maven远程仓库

    最近在搭建springMVC+mybatis的框架,在添加jar包的时候出问题了.以前都是直接将jar包放到lib里面即可,但是看到现在用maven的比较多,就去配置maven.然后发现,在添加某个版 ...