MongoDBで複数のキーを使ってアグリゲーション(集計)を行う方法
MongoDBで複数のキーを基準にアグリゲーション(集計)を行いたい場合は、aggregate()メソッドと$group演算子を組み合わせて使用します。$groupの_idフィールドに複数のフィールドを指定することで、それらを組み合わせた単位でドキュメントをグループ化できます。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。ここでは例として、期日(DueDate)、値(Value)、名前(Name)を持つドキュメントをいくつか登録します。
> db.demo190.insertOne(
... {
... "DueDate" : ISODate("2020-01-01"),
... "Value" : 10,
... "Name" : "Chris"
... }
...);
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3ad76403d395bdc21346bf")
}
>
> db.demo190.insertOne(
... {
... "DueDate" : ISODate("2020-02-05"),
... "Value" : 30,
... "Name" : "David"
... }
...);
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3ad76403d395bdc21346c0")
}
> db.demo190.insertOne(
... {
... "DueDate" : ISODate("2020-01-01"),
... "Value" : 40,
... "Name" : "Chris"
... }
...);
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3ad7f003d395bdc21346c1")
}
登録済みドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo190.find();
このクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e3ad76403d395bdc21346bf"), "DueDate" : ISODate("2020-01-01T00:00:00Z"), "Value" : 10, "Name" : "Chris" }
{ "_id" : ObjectId("5e3ad76403d395bdc21346c0"), "DueDate" : ISODate("2020-02-05T00:00:00Z"), "Value" : 30, "Name" : "David" }
{ "_id" : ObjectId("5e3ad7f003d395bdc21346c1"), "DueDate" : ISODate("2020-01-01T00:00:00Z"), "Value" : 40, "Name" : "Chris" }
複数のキーによる集計クエリの実行
続いて、複数のキー(ここでは「Name」と「DueDateの年」)を組み合わせてグループ化するアグリゲーションクエリを実行します。$year演算子を使うことで、日付型のDueDateから年だけを取り出し、グループ化のキーとして利用しています。
> db.demo190.aggregate( [ { "$group": { "_id": { "Name": "$Name", "DueDate": { "$year": "$DueDate" } }, "Value": { "$sum": "$Value" } } } ], function(err,results) { console.log(results); } );
このクエリを実行すると、次のような出力が得られます。
{ "_id" : { "Name" : "David", "DueDate" : 2020 }, "Value" : 30 }
{ "_id" : { "Name" : "Chris", "DueDate" : 2020 }, "Value" : 50 }
結果の解説
実行結果を見ると、名前(Name)と年(DueDate)の組み合わせごとにグループ化され、$sumによってValueの合計値が計算されていることがわかります。Chrisは2件のドキュメント(Value: 10 と 40)が同じキーに該当するため、合計の50が出力されています。このように、$groupの_idに複数のフィールドを指定するだけで、簡単に複数キーでの集計が実現できます。
-
MongoDBの集計パイプラインでドキュメントを昇順に並べ替えるには?
MongoDBの集計パイプラインでドキュメントを昇順に並べ替える方法MongoDBの集計(アグリゲーション)フレームワークでは、$sortステージを使用することで、結果を特定のフィールドの値に基づいて並べ替えることができます。1を指定すると昇順、-1を指定すると降順になります。ここでは、サンプルコレクションを作成し、$unwindや$groupと組み合わせて$sortによる昇順ソートを実行する手順を解説します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。> db.demo652.insertOne({ ... value:10, ... d
-
MongoDBの集計パイプラインで複数フィールドをカウントする方法($facet活用)
MongoDBで複数のフィールドごとにドキュメントをカウントしたい場合、$facet演算子を使うのが効果的です。$facetは、同じ入力ドキュメント群に対して、単一のステージ内で複数の集計パイプラインを同時に処理できる強力な機能です。この記事では、実際にコレクションを作成し、$facetを組み合わせた集計クエリで複数フィールドの値をカウントする手順を解説します。1. サンプルコレクションの作成まず、insertOne()メソッドを使ってサンプルドキュメントを挿入します。各ドキュメントにはdetails1・details2・details3という3つのネストされたフィールドを持たせます。>