今回は「MongoDB で グループごと に データの合計値 を 集計する 方法」についてまとめます。
MongoDB でグループ化に関する記事はほかにも以下のような記事がありますので参考にしていただければと思います。
- グループごとにデータ件数を集計する ( $group count )
- グループごとにデータの合計値を集計する ( $group sum ) ← 今回の記事
- グループごとにデータの最小値/最大値を集計する ( $group min/max )
- グループごとにデータの平均/標準偏差/分散を集計する ( $group avg/stddev/var )
前提データ
以下のデータを mongo コマンドで投入してある状態で各 item について集計を行っていきます。
> 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)
var MongoClient = require("mongodb").MongoClient;
var URL = "mongodb://localhost:27017";
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();
});
});
実行 & 結果
> node .\index.js
[ { _id: 'note', total: 120 },
{ _id: 'eraser', total: 220 },
{ _id: 'pen', total: 170 } ]
今回は「MongoDB で グループごと に 集計する 方法」についてまとめました。 ポイントは以下の通りです。
- 合計は
{ $sum: <key> }
参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!