つい忘れてしまうAggregation Frameworkの使い方をメモっておく。
これからやること:
teamsコレクションのドキュメントごとに配列playersの要素をカウントする。
テストデータの準備
テストデータ
{
"name": "grampus",
"players": [
"narazaki",
"tulio",
"tamada",
"taguchi"
]
}
{
"name": "fctokyo",
"players": [
"ohta",
"muto"
]
}
テストデータをinsert
> db.teams.insert({ name: "grampus", players: ["narazaki", "tulio", "tamada", "taguchi"] })
> db.teams.insert({ name: "fctokyo", players: ["ohta", "muto"] })
insert後
> db.teams.find()
{ "_id" : ObjectId("54633eb04296e29135e2325d"), "name" : "grampus", "players" : [ "narazaki", "tulio", "tamada", "taguchi" ] }
{ "_id" : ObjectId("54633eb64296e29135e2325e"), "name" : "fctokyo", "players" : [ "ohta", "muto" ] }
Aggregation Frameworkで集計する
> db.teams.aggregate(
{ $project: { players: 1, name: 1 }},
{ $unwind: "$players" },
{ $group: { _id: "$name", count: { $sum: 1 }}}
)
-
$project
Aggregationに流す要素の指定 -
$unwind
配列を各要素ごとのドキュメントに展開する -
$group
グループ化 -
$sum
はグループ内で$unwind
で展開したドキュメントを数えている
集計結果
{ "_id" : "fctokyo", "count" : 2 }
{ "_id" : "grampus", "count" : 4 }
参考にしたページ