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

【MongoDB】特定のフィールドの値に基づいて配列内のドキュメントをカウントする方法

MongoDBで配列内のドキュメントを条件付きでカウントする方法

MongoDBで、配列内の特定のフィールドの値に一致するドキュメントをカウントしたい場合は、集計パイプライン(Aggregation Pipeline)$match ステージを使用します。本記事では、$unwind$match$group という流れで、配列要素を展開し、条件に合致するものだけを抽出してカウントする手順をサンプルコード付きで解説します。

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

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

> db.demo726.insertOne(
...    {
...       id:101,
...       "details": [
...          {
...             Name:"Chris"
...
...          },
...          {
...             Name:"Chris"
...
...          },
...          {
...             Name:"Bob"
...          }
...       ]
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5eab318643417811278f5894")
}

このコレクションには、details 配列の中に「Chris」が2件、「Bob」が1件含まれたドキュメントが1件登録されています。

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

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

> db.demo726.find();

実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5eab318643417811278f5894"), "id" : 101, "details" : [ { "Name" : "Chris" }, { "Name" : "Chris" }, { "Name" : "Bob" } ] }

3. 特定のフィールドの値に基づいてカウントするクエリ

以下が、配列内のドキュメントを特定のフィールドの値に基づいてカウントするためのクエリです。

> db.demo726.aggregate([
...
...    { $unwind: '$details' },
...
...    { $match: { 'details.Name': "Chris"} },
...       { $group: {
...          _id: "$Name",
...          Total_Value: { $sum: 1 }
...       }
...    }
... ]);

各ステージの役割

  • $unwinddetails 配列を展開し、各要素を個別のドキュメントとして扱えるようにします。
  • $matchdetails.Name が「Chris」と一致するドキュメントのみを絞り込みます。
  • $group:一致したドキュメントをグループ化し、$sum: 1 によって件数をカウントします。

実行結果

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

{ "_id" : null, "Total_Value" : 2 }

結果から、「Chris」という名前の要素が2件存在することが確認できました。なお、_idnull になっているのは、$group_id に指定した "$Name" というフィールドが、$unwind 後のドキュメント構造上はトップレベルに存在しないためです。名前ごとに正しくグループ化したい場合は、_id: "$details.Name" のように指定すると、意図した通りのグルーピングが可能になります。

  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で特定の値を持つ列の数をカウントする方法【SUM関数の活用】

    はじめにMySQLでは、SUM関数と加算演算子(+)・論理演算子(AND)を組み合わせることで、テーブル内の複数の列に含まれる特定の値(たとえば「1」)の合計個数や、すべての列がその値を持つ行数を簡単に集計できます。本記事では、サンプルテーブルを作成しながら、具体的なSQLクエリの書き方と実行結果をわかりやすく解説します。基本構文特定の値を持つ列の数をカウントする場合、以下のような構文を使用します。selectsum(yourColumnName1 + yourColumnName2 + yourColumnName3 ... N) as `anyAliasName1`,sum(yourCol