MongoDB で グループごと に データ件数 を 集計する

0 件のコメント

今回は「MongoDB で グループごと に データ件数 を 集計する 方法」についてまとめます。 MongoDB でグループ化を行う基本と簡単な集計(件数取得)のサンプルコードを見ていきます。

MongoDB でグループ化に関する記事はほかにも以下のような記事がありますので参考にしていただければと思います。

前提データ

以下のデータを mongo コマンドで投入してある状態で各 item について集計を行っていきます。

1
2
3
4
5
6
7
8
9
10
11
12
> db.orders.insertMany([
  { datetime: ISODate("2017-12-15T12:00:00+09:00"), item: "pen", amount: 70 },
  { datetime: ISODate("2017-12-15T12:00:00+09:00"), item: "note", amount: 40 },
  { datetime: ISODate("2017-12-15T12:00:00+09:00"), item: "eraser", amount: 100 },
  { datetime: ISODate("2017-12-12T12:00:00+09:00"), item: "note", amount: 80 },
  { datetime: ISODate("2017-12-08T12:00:00+09:00"), item: "eraser", amount: 50 },
  { datetime: ISODate("2017-11-21T12:00:00+09:00"), item: "eraser", amount: 70 },
  { datetime: ISODate("2017-11-13T12:00:00+09:00"), item: "pen", amount: 20 },
  { datetime: ISODate("2017-11-02T12:00:00+09:00"), item: "pen", amount: 40 },
  { datetime: ISODate("2017-10-23T12:00:00+09:00"), item: "pen", amount: 30 },
  { datetime: ISODate("2017-10-18T12:00:00+09:00"), item: "pen", amount: 10 }
]);

グループ化キー

グループ化は aggregate() の $group を利用して実現します。 $group を使ってグループ化する際、グループ化キーは _id で指定します。

単純な文字列プロパティをキーとする場合は以下のようになります。

1
2
3
4
5
{
  $group: {
    _id: "$item"
  }
}

日付単位でグループ化したい場合は年月日などに分解したオブジェクトがキーとなるように指定します。

1
2
3
4
5
6
7
8
9
{
  $group: {
    _id: {
      yyyy: { $year: "$datetime" },
      mm: { $month: "$datetime" },
      dd: { $dayOfMonth: "$datetime" }
    }
  }
}

_id に null が指定された場合はグループ化せずすべてのドキュメントを対象に統計を取ることができます。

1
2
3
4
5
{
  $group: {
    _id: null
  }
}

グループごとに件数を集計(group count)

では、さっそく重複しているデータの件数をカウントするような集計を行うサンプルを見ていきます。 item でグループ化して item ごとに何件あるかカウントするサンプルです。

件数カウントしたい場合 { $sum: 1 } とすることでカウントできます。

コード(index.js)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var MongoClient = require("mongodb").MongoClient;
 
MongoClient.connect(URL, (err, client) => {
  if (err) {
    client.close();
    return;
  }
 
  var db = client.db("sample");
 
  db.collection("orders").aggregate([
    {
      $group: {
        _id: "$item",
        count: { $sum: 1 }
      }
    }
  ]).toArray().then((docs) => {
    console.log(docs);
  }).catch((err) => {
    console.log(err);
  }).then(()=>{
    client.close();
  });
});

実行 & 結果

1
2
3
4
> node .\index.js
[ { _id: 'note', count: 2 },
  { _id: 'eraser', count: 3 },
  { _id: 'pen', count: 5 } ]

今回は「MongoDB で グループごと に 集計する 方法」についてまとめました。 ポイントは以下の通りです。

  • グループ化は aggregate()$group を使う
  • グループ化キーは _id で指定
  • 件数集計は { $sum: 1 }

参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!

最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!