MongoDBですべてのドキュメントの配列フィールド内の一意な要素をカウントする方法
MongoDBで、複数のドキュメントにまたがる配列型フィールド内の一意な(重複しない)要素をカウントしたい場合は、aggregate()メソッドと$groupステージを組み合わせて使用します。さらに、配列を個々の要素に分解するために$unwindも活用します。
この記事では、実際にコレクションを作成し、一意な要素の出現回数を集計する手順を解説します。
サンプルコレクションの作成
まず、配列フィールドを持つドキュメントを含むコレクションを作成しましょう。
> db.demo493.insertOne({"SubjectName":["MySQL","MongoDB","Java"]});{
"acknowledged" : true,
"insertedId" : ObjectId("5e849f97b0f3fa88e22790c4")
}
> db.demo493.insertOne({"SubjectName":["C++","MongoDB","C"]});{
"acknowledged" : true,
"insertedId" : ObjectId("5e849fa4b0f3fa88e22790c5")
}
> db.demo493.insertOne({"SubjectName":["MySQL","MongoDB","C"]});{
"acknowledged" : true,
"insertedId" : ObjectId("5e849fb2b0f3fa88e22790c6")
}ここでは「SubjectName」という配列フィールドに、複数の科目名が格納された3件のドキュメントを挿入しています。
挿入したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo493.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e849f97b0f3fa88e22790c4"), "SubjectName" : [ "MySQL", "MongoDB", "Java" ] }
{ "_id" : ObjectId("5e849fa4b0f3fa88e22790c5"), "SubjectName" : [ "C++", "MongoDB", "C" ] }
{ "_id" : ObjectId("5e849fb2b0f3fa88e22790c6"), "SubjectName" : [ "MySQL", "MongoDB", "C" ] }一意な要素をカウントするクエリ
すべてのドキュメントにわたって、配列フィールド内の一意な要素とその出現回数をカウントするには、次の集計パイプラインを使用します。
> db.demo493.aggregate([
... { $unwind: "$SubjectName" },
... { $group: { _id: "$SubjectName", Frequency: { $sum : 1 } } }
... ]
... );このクエリの仕組みは以下の通りです。
- $unwind: 各ドキュメントの「SubjectName」配列を分解し、配列の要素ごとに個別のドキュメントを生成します。
- $group: 要素の値ごとにドキュメントをグループ化し、
$sum: 1によって各要素の出現回数をカウントします。
実行結果
上記のクエリを実行すると、次のような出力が得られます。
{ "_id" : "C++", "Frequency" : 1 }
{ "_id" : "C", "Frequency" : 2 }
{ "_id" : "Java", "Frequency" : 1 }
{ "_id" : "MySQL", "Frequency" : 2 }
{ "_id" : "MongoDB", "Frequency" : 3 }この結果から、「MongoDB」は3つのドキュメントすべてに出現していることがわかります。一方、「MySQL」と「C」はそれぞれ2回、「C++」と「Java」は1回だけ出現しています。このように、$unwindと$groupを組み合わせることで、配列フィールド内の一意な要素を簡単に集計できます。
-
MongoDBですべてのドキュメントにわたる個別(ユニーク)な値をカウントする方法
MongoDBでコレクション内のすべてのドキュメントにわたって、重複を除いた個別(ユニーク)な値の数をカウントしたい場合は、aggregate()メソッドを使用します。この記事では、実際のコード例とともに、その手順をわかりやすく解説します。 サンプルコレクションの作成 まず、insertOne()メソッドを使って、デモ用のコレクション「demo718」にドキュメントを挿入します。 > db.demo718.insertOne( ... { ... id:101, ... details: ... { ... Oth
-
MongoDBの集計パイプラインで複数フィールドをカウントする方法($facet活用)
MongoDBで複数のフィールドごとにドキュメントをカウントしたい場合、$facet演算子を使うのが効果的です。$facetは、同じ入力ドキュメント群に対して、単一のステージ内で複数の集計パイプラインを同時に処理できる強力な機能です。この記事では、実際にコレクションを作成し、$facetを組み合わせた集計クエリで複数フィールドの値をカウントする手順を解説します。1. サンプルコレクションの作成まず、insertOne()メソッドを使ってサンプルドキュメントを挿入します。各ドキュメントにはdetails1・details2・details3という3つのネストされたフィールドを持たせます。>