MongoDB で グループごと に データの合計値 を 集計する

0 件のコメント

今回は「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 }
]);

グループごとに値を集計(group sum)

グループごとに件数をカウントするものと近いですが、こちらはグループごとに集計を行っています。 item ごとに amount の合計を算出するサンプルコードです。

件数カウントの場合は { $sum: 1 } と固定値を指定していましたが、特定のプロパティ値を合計する場合 { $sum: <key> } のように合計したいプロパティ名をキーに指定します。

コード(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",
        total: { $sum: "$amount" }
      }
    }
  ]).toArray().then((docs) => {
    console.log(docs);
  }).catch((err) => {
    console.log(err);
  }).then(()=>{
    client.close();
  });
});

実行 & 結果

1
2
3
4
> node .\index.js
[ { _id: 'note', total: 120 },
  { _id: 'eraser', total: 220 },
  { _id: 'pen', total: 170 } ]

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

  • 合計は { $sum: <key> }

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

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