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:{$get: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
  }
}

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值