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

MongoDBで特定の値と2つの日付範囲を条件にデータを取得し、グループ化して合計とカウントを求める方法

MongoDBで条件に一致するドキュメントを絞り込むには $match を使用し、2つの日付の間のデータを取得するには $gte(以上)と $lte(以下)を組み合わせます。

1. サンプルコレクションの作成

まず、ドキュメントを含むコレクションを作成しましょう。

> db.demo560.insertOne({"value1":40,"value2":40,shippingDate:new ISODate("2020-02-26")});{
    "acknowledged" : true, "insertedId" : ObjectId("5e8f3d5254b4472ed3e8e867")
}
> db.demo560.insertOne({"value1":20,"value2":60,shippingDate:new ISODate("2020-02-26")});{
    "acknowledged" : true, "insertedId" : ObjectId("5e8f3d5254b4472ed3e8e868")
}
> db.demo560.insertOne({"value1":40,"value2":70,shippingDate:new ISODate("2020-03-31")});{
    "acknowledged" : true, "insertedId" : ObjectId("5e8f3d5254b4472ed3e8e869")
}
> db.demo560.insertOne({"value1":40,"value2":130,shippingDate:new ISODate("2020-03-31")});{
    "acknowledged" : true, "insertedId" : ObjectId("5e8f3d5254b4472ed3e8e86a")
}

2. 登録されたドキュメントの確認

find() メソッドを使って、コレクション内のすべてのドキュメントを表示します。

> db.demo560.find();

このクエリを実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5e8f3d5254b4472ed3e8e867"), "value1" : 40, "value2" : 40, "shippingDate" : ISODate("2020-02-26T00:00:00Z") }
{ "_id" : ObjectId("5e8f3d5254b4472ed3e8e868"), "value1" : 20, "value2" : 60, "shippingDate" : ISODate("2020-02-26T00:00:00Z") }
{ "_id" : ObjectId("5e8f3d5254b4472ed3e8e869"), "value1" : 40, "value2" : 70, "shippingDate" : ISODate("2020-03-31T00:00:00Z") }
{ "_id" : ObjectId("5e8f3d5254b4472ed3e8e86a"), "value1" : 40, "value2" : 130, "shippingDate" : ISODate("2020-03-31T00:00:00Z") }

3. 日付範囲と特定の値で集計するクエリ

以下は、2つの日付の間のデータを特定の値とともに取得し、グループ化して合計とカウントを求めるクエリです。ここでは value1 の「40」を条件値として指定しています。

> db.demo560.aggregate([
... {
...     $match: {
...         "value1": 40,
...         "shippingDate": {
...             "$gte": ISODate("2020-02-26"),
...             "$lte": ISODate("2020-03-31")
...         }
...     }
... },
... {
...     $group: {
...         "_id": "$shippingDate",
...         total: {
...             $sum: '$value2'
...         },
...         count: {
...             $sum: 1
...         }
...     }
... }
... ])

4. 実行結果

このパイプラインを実行すると、次のような出力が得られます。

{ "_id" : ISODate("2020-03-31T00:00:00Z"), "total" : 200, "count" : 2 }
{ "_id" : ISODate("2020-02-26T00:00:00Z"), "total" : 40, "count" : 1 }

解説

このクエリでは、まず $match ステージによって value1 が 40 であり、shippingDate が 2020年2月26日から2020年3月31日の間に含まれるドキュメントのみがフィルタリングされます。その後、$group ステージで出荷日ごとにドキュメントをグループ化し、$sum 演算子を使って value2 の合計値(total)とドキュメントの件数(count)を同時に算出しています。

結果を見ると、2020年3月31日のグループでは2件のドキュメントが該当し、value2 の合計は 200(70 + 130)となっています。一方、2020年2月26日のグループでは1件のみ該当し、合計は 40 です。value1 が 20 のドキュメントは条件に一致しないため除外されている点にも注目してください。

  1. MySQLで列内の特定の値の出現回数(カウント)を取得する方法

    MySQLでは、COUNT(*)関数とWHERE句を組み合わせることで、特定の列に含まれる指定した値の出現回数を簡単に取得できます。この記事では、サンプルテーブルを作成し、実際にクエリを実行しながら手順を解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成しましょう。 mysql> create table DemoTable ( Id int, Name varchar(100) ); Query OK, 0 rows affected (1.40 sec) Id(整数型)とName(可変長文字列型)の2つの列を持つ

  2. MySQLで指定した2つの日付の間にあるレコードの合計値を取得する方法

    はじめにMySQLで特定の2つの日付の間に存在するレコードの数値合計を求めたい場合は、BETWEENキーワードを使用します。BETWEEN句は、指定した範囲(開始日と終了日を含む)に該当するレコードを抽出できる便利な演算子です。この記事では、実際にテーブルを作成し、日付の範囲を指定して合計値を取得する手順を解説します。1. テーブルの作成まず、サンプル用のテーブルを作成します。ここでは「Value(数値)」と「PurchaseDate(購入日時)」というカラムを持つテーブルを定義します。mysql> create table DemoTable1444  -> (  -> V