MongoDBで日付範囲をもとに日・週・月単位でデータをグループ化する方法
MongoDBで日付データを週や月の単位で集計したい場合、集計パイプライン(Aggregation Pipeline)の日付演算子「$week」や「$month」を活用します。本記事では、サンプルコレクションを作成し、日付範囲に基づいてデータをグループ化する具体的な手順を解説します。
1. サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。以下のコマンドで「demo133」コレクションにドキュメントを挿入します。
> db.demo133.insertOne({"Rank":18,"DueDate":new ISODate("2020-01-10")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e31980968e7f832db1a7f78")
}
> db.demo133.insertOne({"Rank":12,"DueDate":new ISODate("2020-01-10")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e31982568e7f832db1a7f79")
}
> db.demo133.insertOne({"Rank":12,"DueDate":new ISODate("2020-02-01")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e31986568e7f832db1a7f7a")
}
> db.demo133.insertOne({"Rank":20,"DueDate":new ISODate("2020-02-01")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e31986c68e7f832db1a7f7b")
}
2. 登録したドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo133.find();
このクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e31980968e7f832db1a7f78"), "Rank" : 18, "DueDate" : ISODate("2020-01-10T00:00:00Z") }
{ "_id" : ObjectId("5e31982568e7f832db1a7f79"), "Rank" : 12, "DueDate" : ISODate("2020-01-10T00:00:00Z") }
{ "_id" : ObjectId("5e31986568e7f832db1a7f7a"), "Rank" : 12, "DueDate" : ISODate("2020-02-01T00:00:00Z") }
{ "_id" : ObjectId("5e31986c68e7f832db1a7f7b"), "Rank" : 20, "DueDate" : ISODate("2020-02-01T00:00:00Z") }
3. 日付範囲に基づくグループ化クエリ
それでは、日付をもとに週単位でグループ化するクエリを見ていきましょう。aggregate()メソッドの中で、まず$projectステージにより$week演算子で週番号を、$month演算子で月番号を抽出します。その後、$groupステージで週番号をキーとしてグループ化し、Rankの平均値を$avg演算子で算出しています。
> db.demo133.aggregate([
... {
... "$project": {
... "DueDateWeek": { "$week": "$DueDate" },
... "DueDateMonth": { "$month": "$DueDate" },
... "Rank": 1
... }
... },
... {
... "$group": {
... "_id": "$DueDateWeek",
... "AvgValue": { "$avg": "$Rank" },
... "MonthValue": { "$first": "$DueDateMonth" }
... }
... }
... ])
このクエリを実行すると、以下のような結果が出力されます。
{ "_id" : 4, "AvgValue" : 16, "MonthValue" : 2 }
{ "_id" : 1, "AvgValue" : 15, "MonthValue" : 1 }
結果の読み方
出力結果の各フィールドは次の意味を持ちます。
- _id:グループ化のキーとなった週番号($weekの結果)
- AvgValue:各週に含まれるドキュメントのRankの平均値
- MonthValue:その週に属する月番号($monthの結果)
この例では、第1週(_id: 1)に属するドキュメントのRank平均は15、第4週(_id: 4)に属するドキュメントのRank平均は16という結果になっています。なお、$weekは年間の週番号(0〜53)を返し、$monthは月番号(1〜12)を返します。日単位でグループ化したい場合は、「$dayOfMonth」「$dayOfWeek」などの演算子を同じ要領で使うことで対応可能です。
-
JavaScriptのsetUTCDate()メソッドでUTC基準の日付(月の日)を設定する方法
JavaScriptの setUTCDate() メソッドは、協定世界時(UTC)に基づいて、指定された日付オブジェクトの「月の日」(何日か)を設定するためのメソッドです。ローカルタイムゾーンではなくUTCを基準に処理されるため、国際的なアプリケーションやサーバー間での日時管理において正確な日付操作が可能になります。setUTCDate()メソッドの構文とパラメータsetUTCDate(dayValue) メソッドが受け取るパラメータは以下のとおりです。dayValue − 月の日を表す1から31までの整数値を指定します。使用例以下のコードを実行すると、指定した日付に対してUTC基準で月の日を
-
JavaScriptで日付の「日」を設定する方法|setDate()の使い方を解説
JavaScriptでは、DateオブジェクトのsetDate()メソッドを使うことで、日付の「日」(1〜31)を設定・変更できます。この記事では、実際のコード例と実行結果をもとに、setDate()の基本的な使い方をわかりやすく解説します。 setDate()メソッドとは setDate()は、Dateオブジェクトの「日」の値だけを変更するためのメソッドです。年や月はそのままに、日にちだけを差し替えたい場合に便利です。引数には1〜31の整数を指定しますが、範囲外の値を渡してもエラーにはならず、自動的に月をまたいだ日付へと調整されます。また、このメソッドは元のDateオブジェクト自体を書き換え