LoginSignup
0
0

More than 5 years have passed since last update.

the little book mongodbのAggregating Dataをざっくり説明

Posted at

the little book mongodbは無料で読めるMongoDBの本です。
MongoDBの薄い本として有志による日本語訳も公開されています。
先日、英語の勉強も兼ねて日本語訳で補完しながら原文を読んでいたところ、いくつか異なる部分を見つけました。
中でも、Chapter 6 - Aggregating Dataの部分が日本語訳ではMap Reduceとなっていて、結構内容が異なります。
というのも、原文のほうが2014年5月にガッツリ変わっているようです。
MongoDBのRelease Noteを追ってみると確かにそのあたり(2.2~2.4らへん)がAggregationFrameworkが導入されたようなのでそれを受けての改稿かと思われます。

今回は、そのAggregating Dataの部分をざっくりと訳してざっくり説明します。
使うデータなどは原文を参照。
ユニコーンのデータらしい。My Little Ponyとかその辺かと思ったら違った。
vampiresというフィールドも謎なんだけど、何か元ネタとかあるのかなあ。

Aggregating Data

集約パイプライン

集約パイプラインはコレクション内のドキュメントに対して、(UNIXのパイプのように)変換して組み合わせることができます。
今まで使ってきたcount()は単純な数なら数えられましたが、男性、女性の各人数を知りたいときには以下のようにします。

db.unicorns.aggregate([
    {$group:{_id:'$gender',total: {$sum:1}}}
])
{ "_id" : "f", "total" : 5 }
{ "_id" : "m", "total" : 7 }

$groupはSQLでのGROUP BYのように_idフィールドによってグループ化を行います。
フィールドの値を参照するため、genderではなく、$genderになります。

そのほかの演算子としては、$matchがあります。これは、集約されるドキュメントを制限します(findの条件部分のようなもの)。

db.unicorns.aggregate([
    {$match: {weight:{$lt:600}}},
    {$group: {_id:'$gender',  total:{$sum:1}, avgVamp:{$avg:'$vampires'}}},
    {$sort:{avgVamp:-1}}
])
{ "_id" : "f", "total" : 3, "avgVamp" : 61.5 }
{ "_id" : "m", "total" : 2, "avgVamp" : 50.5 }

$sortを使って集約結果をソートすることができる。$limit$skipも用意されています。
また、$groupの中では$avgを使って平均を求めることもできます。

配列の内部に格納されている値を集約したい場合は、一度$unwind演算子を使ってフラットにする必要があります。

db.unicorns.aggregate([
    {$unwind:'$loves'},
    {$group: {_id:'$loves',  total:{$sum:1}, unicorns:{$addToSet:'$name'}}},
    {$sort:{total:-1}},
    {$limit:3}
])
{ "_id" : "apple", "total" : 5, "unicorns" : [ "Solnara", "Raleigh", "Leia", "Pilot", "Roooooodles" ] }
{ "_id" : "carrot", "total" : 4, "unicorns" : [ "Solnara", "Nimue", "Aurora", "Horny" ] }
{ "_id" : "grape", "total" : 4, "unicorns" : [ "Kenny", "Dunx", "Nimue", "Aurora" ] }

多くのユニコーンが好きな食べ物のリストを、$limitを使うことで上位N番目を得ることができます。

そのほかにも、特定のフィールドの値を利用して新しいフィールドの作成を行うことが$projectという強力な演算子も用意されています。
バージョン2.6からは集約は(1章の)カーソルを返したり、$out演算子により別のコレクションに結果を書き込むことができるようになり、より強力なものとなっています。
そのほかの演算子や例についてはMongoDBのマニュアルを参照してください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0