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 } }