MongoDB的聚合函数 Aggregate
2014-09-25 07:39
351 查看
Aggregate的使用,有利于我们对MongoDB中的集合进行进一步的拆分。
示例:
[java]
view plaincopy
db.collection.aggregate(
{$match:{x:1},
{limit:10},
{$group:{_id:"$age"}}}
);
操作符介绍:
$project:包含、排除、重命名和显示字段
$match:查询,需要同find()一样的参数
$limit:限制结果数量
$skip:忽略结果的数量
$sort:按照给定的字段排序结果
$group:按照给定表达式组合结果
$unwind:分割嵌入数组到自己顶层文件
============================================================
这是MongoDB官网上的一个Data Model:
[java]
view plaincopy
{
"_id": "10280",//zipcode
"city": "NEW YORK",//城市
"state": "NY",//城市缩写
"pop": 5574,//人口
"loc": [ //经纬度
-74.016323,
40.710537
]
}
1、查出一个超过1千万人口的城市
[java]
view plaincopy
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
[java]
view plaincopy
db.zipcodes.aggregate( { $group :
{ _id : { state : "$state", city : "$city" },
pop : { $sum : "$pop" } } },
{ $group :
{ _id : "$_id.state",
avgCityPop : { $avg : "$pop" } } } )
上述示例中出现了两个$group,那是什么含义呢?
第一个$group是将原来的zipcodes 这个 document变成新的,如:
[java]
view plaincopy
{
"_id" : {
"state" : "CO",
"city" : "EDGEWATER"
},
"pop" : 13154
}
第二个 $group是在,原有的基础之上,再进行一次重新格式化数据,再生成新的document,如:
[java]
view plaincopy
{
"_id" : "MN",
"avgCityPop" : 5335
},
3、查询每个州人口最大和最小的城市
[java]
view plaincopy
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"}
}
}
);
数据结构,如下:
[java]
view plaincopy
{
"state" : "RI",
"biggestCity" : {
"name" : "CRANSTON",
"pop" : 176404
},
"smallestCity" : {
"name" : "CLAYVILLE",
"pop" : 45
}
}
示例:
[java]
view plaincopy
db.collection.aggregate(
{$match:{x:1},
{limit:10},
{$group:{_id:"$age"}}}
);
操作符介绍:
$project:包含、排除、重命名和显示字段
$match:查询,需要同find()一样的参数
$limit:限制结果数量
$skip:忽略结果的数量
$sort:按照给定的字段排序结果
$group:按照给定表达式组合结果
$unwind:分割嵌入数组到自己顶层文件
============================================================
这是MongoDB官网上的一个Data Model:
[java]
view plaincopy
{
"_id": "10280",//zipcode
"city": "NEW YORK",//城市
"state": "NY",//城市缩写
"pop": 5574,//人口
"loc": [ //经纬度
-74.016323,
40.710537
]
}
1、查出一个超过1千万人口的城市
[java]
view plaincopy
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
[java]
view plaincopy
db.zipcodes.aggregate( { $group :
{ _id : { state : "$state", city : "$city" },
pop : { $sum : "$pop" } } },
{ $group :
{ _id : "$_id.state",
avgCityPop : { $avg : "$pop" } } } )
上述示例中出现了两个$group,那是什么含义呢?
第一个$group是将原来的zipcodes 这个 document变成新的,如:
[java]
view plaincopy
{
"_id" : {
"state" : "CO",
"city" : "EDGEWATER"
},
"pop" : 13154
}
第二个 $group是在,原有的基础之上,再进行一次重新格式化数据,再生成新的document,如:
[java]
view plaincopy
{
"_id" : "MN",
"avgCityPop" : 5335
},
3、查询每个州人口最大和最小的城市
[java]
view plaincopy
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"}
}
}
);
数据结构,如下:
[java]
view plaincopy
{
"state" : "RI",
"biggestCity" : {
"name" : "CRANSTON",
"pop" : 176404
},
"smallestCity" : {
"name" : "CLAYVILLE",
"pop" : 45
}
}
相关文章推荐
- mongodb的聚合函数aggregate的$match和$group方法。
- mongodb-aggregate(聚合函数)
- MongoDB Aggregate Methods(2) MonoDB 的 3 种聚合函数
- MongoDB之aggregate聚合函数应用
- MongoDB的聚合函数 Aggregate
- MongoDB的聚合函数 Aggregate
- mongodb的聚合函数的$project方法运用。
- 【mongoDB高级篇①】聚集运算之group,aggregate
- mongodb的aggregate学习之1-pipeline
- 使用java 操作mongodb的aggregate
- Mongodb中数据聚合之聚合管道aggregate
- MongoDB的聚合(aggregate)
- MongoDB聚合操作 (group, aggregate, mapReduce操作)
- 在MongoDB中实现聚合函数
- mongodb 聚合函数
- java操作mongodb(聚合函数)-分组找出每组的最大值
- node.js mongodb aggregate 分组时时间差8小时的解决方案
- mongoDB高级篇①】聚集运算之group,aggregate
- mongodb高级查询aggregate使用,主要用于统计分析,筛选排序测试
- Codeigniter MongoDB 扩展之使用 Aggregate 方法实现 Mysql 的 Sum 方法