MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

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」などの演算子を同じ要領で使うことで対応可能です。

  1. JavaScriptのsetUTCDate()メソッドでUTC基準の日付(月の日)を設定する方法

    JavaScriptの setUTCDate() メソッドは、協定世界時(UTC)に基づいて、指定された日付オブジェクトの「月の日」(何日か)を設定するためのメソッドです。ローカルタイムゾーンではなくUTCを基準に処理されるため、国際的なアプリケーションやサーバー間での日時管理において正確な日付操作が可能になります。setUTCDate()メソッドの構文とパラメータsetUTCDate(dayValue) メソッドが受け取るパラメータは以下のとおりです。dayValue − 月の日を表す1から31までの整数値を指定します。使用例以下のコードを実行すると、指定した日付に対してUTC基準で月の日を

  2. JavaScriptで日付の「日」を設定する方法|setDate()の使い方を解説

    JavaScriptでは、DateオブジェクトのsetDate()メソッドを使うことで、日付の「日」(1〜31)を設定・変更できます。この記事では、実際のコード例と実行結果をもとに、setDate()の基本的な使い方をわかりやすく解説します。 setDate()メソッドとは setDate()は、Dateオブジェクトの「日」の値だけを変更するためのメソッドです。年や月はそのままに、日にちだけを差し替えたい場合に便利です。引数には1〜31の整数を指定しますが、範囲外の値を渡してもエラーにはならず、自動的に月をまたいだ日付へと調整されます。また、このメソッドは元のDateオブジェクト自体を書き換え