zoukankan      html  css  js  c++  java
  • MongoDB的聚合函数 Aggregate

    Aggregate的使用,有利于我们对MongoDB中的集合进行进一步的拆分。

    示例:

    1. db.collection.aggregate(  
    2.     {$match:{x:1},  
    3.     {limit:10},  
    4.     {$group:{_id:"$age"}}}  
    5. );
    操作符介绍:

    $project:包含、排除、重命名和显示字段

    $match:查询,需要同find()一样的参数

    $limit:限制结果数量

    $skip:忽略结果的数量

    $sort:按照给定的字段排序结果

    $group:按照给定表达式组合结果

    $unwind:分割嵌入数组到自己顶层文件

    ============================================================

    这是MongoDB官网上的一个Data Model:

    1. {  
    2.   "_id""10280",//zipcode  
    3.   "city""NEW YORK",//城市  
    4.   "state""NY",//城市缩写  
    5.   "pop"5574,//人口  
    6.   "loc": [ //经纬度  
    7.     -74.016323,  
    8.     40.710537  
    9.   ]  
    10. }  
    1、查出一个超过1千万人口的城市
    1. db.zipcodes.aggregate(  
    2.     {$group:{_id:"$state", totalPop:{$sum:"$pop"}},  
    3.     {$match:{totalPop:{$gte:10000000}}}  
    4. );  

    上面的语句相当于: 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

    1. db.zipcodes.aggregate( { $group :  
    2.                          { _id : { state : "$state", city : "$city" },  
    3.                            pop : { $sum : "$pop" } } },  
    4.                        { $group :  
    5.                        { _id : "$_id.state",  
    6.                          avgCityPop : { $avg : "$pop" } } } )  

    上述示例中出现了两个$group,那是什么含义呢?

    第一个$group是将原来的zipcodes 这个 document变成新的,如:

    1. {  
    2.   "_id" : {  
    3.     "state" : "CO",  
    4.     "city" : "EDGEWATER"  
    5.   },  
    6.   "pop" : 13154  
    7. }  

    第二个 $group是在,原有的基础之上,再进行一次重新格式化数据,再生成新的document,如:

    1. {  
    2.   "_id" : "MN",  
    3.   "avgCityPop" : 5335  
    4. }, 

    3、查询每个州人口最大和最小的城市

    1. db.zipcodes.aggregate(  
    2.     {$group:{_id:{state:"$state",city:"$city"}, totalPop:{$sum:"$pop"}}},//统计州的所有人,生成一个新的文档,是关于州与其总人口  
    3.     {$sort:{"totalPop":-1}},//对新文档,根据人口数倒序排序  
    4.     {$group:{_id:"$_id.state",  
    5.         "biggestCity":{$first:"$_id.city"},//最大人口的城市  
    6.         "biggestPop":{$first:"totalPop"},//最大人口的数量  
    7.         "smallestCity":{$last:"$_id.city"},  
    8.         "smallestPop":{$last:"totalPop"}  
    9.     }},//重新组成一个新的文件,包含,州名,最大人口数和最小人口数  
    10.     //本来结构到此基本上差不多了  
    11.     //但我们需要再对数据进行格式化  
    12.     {$project:  
    13.         {_id:0,  
    14.         state:"$_id",  
    15.         biggestCity:{name:"$biggestCity",pop:"$biggestPop"},  
    16.         smallestCity:{name:"$smallestCity",pop:"$smallestPop"}        
    17.         }  
    18.     }  
    19. );  

    数据结构,如下:

    1. {  
    2.   "state" : "RI",  
    3.   "biggestCity" : {  
    4.     "name" : "CRANSTON",  
    5.     "pop" : 176404  
    6.   },  
    7.   "smallestCity" : {  
    8.     "name" : "CLAYVILLE",  
    9.     "pop" : 45  
    10.   }  

  • 相关阅读:
    关键字static在C和C++中的区别
    C指针声明解读之左右法则
    各大公司面试题集锦
    C++的const和static的用法
    C++11常用特性总结
    C++多态下的访问修饰符
    #define 宏实现函数功能可能存在的问题
    Qt读写Json
    C/C++ 内存与指针
    C++ delete仍可访问的问题
  • 原文地址:https://www.cnblogs.com/moqiang02/p/4061130.html
Copyright © 2011-2022 走看看