MongoDBの集約関数Aggregate

3767 ワード

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>=1000000に相当します.
分析:
$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が2つ現れていますが、それはどういう意味ですか?
最初の$groupは、元のzipcodesというdocumentを新しいものにしました.
{
  "_id" : {
    "state" : "CO",
    "city" : "EDGEWATER"
  },
  "pop" : 13154
}

2番目の$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
  }
}