MongoDBの$groupと$sumを使ってドキュメント内の重複データの出現回数を取得する方法
MongoDBでグループ集計を行い、同じ値が何回出現しているか(重複回数)を取得したい場合は、集計パイプラインの $group 演算子と $sum 演算子を組み合わせるのが定番の手法です。
1. サンプルコレクションの作成
まず、動作確認用に「Marks(点数)」フィールドを持つドキュメントをいくつか挿入したコレクションを作成します。
> db.demo676.insertOne({"Marks":87});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea41eed04263e90dac943f2")
}
> db.demo676.insertOne({"Marks":75});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea41ef304263e90dac943f3")
}
> db.demo676.insertOne({"Marks":87});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea41ef404263e90dac943f4")
}
> db.demo676.insertOne({"Marks":65});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea41ef704263e90dac943f5")
}
> db.demo676.insertOne({"Marks":65});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea41ef804263e90dac943f6")
}2. 登録したドキュメントの確認
find() メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo676.find();
このクエリを実行すると、次のような結果が出力されます。
{ "_id" : ObjectId("5ea41eed04263e90dac943f2"), "Marks" : 87 }
{ "_id" : ObjectId("5ea41ef304263e90dac943f3"), "Marks" : 75 }
{ "_id" : ObjectId("5ea41ef404263e90dac943f4"), "Marks" : 87 }
{ "_id" : ObjectId("5ea41ef704263e90dac943f5"), "Marks" : 65 }
{ "_id" : ObjectId("5ea41ef804263e90dac943f6"), "Marks" : 65 }3. 重複する値ごとの出現回数を集計する
ここからが本題です。aggregate() に $group を指定し、_id にグループ化のキーとなるフィールド(ここでは $Marks)を設定します。そして $sum: 1 を使うことで、各グループに属するドキュメントの件数をカウントできます。
> db.demo676.aggregate( { $group: {
... _id: {Marks: "$Marks" },
... 'Count': { $sum :1 }
... }})実行すると、値ごとに出現回数がまとめられた次のような結果が得られます。
{ "_id" : { "Marks" : 75 }, "Count" : 1 }
{ "_id" : { "Marks" : 65 }, "Count" : 2 }
{ "_id" : { "Marks" : 87 }, "Count" : 2 }結果の読み方
この出力からは、次のことがわかります。
- 「75」は1件のみ存在する(重複なし)
- 「65」は2件存在する(1回重複)
- 「87」も2件存在する(1回重複)
このように $group + $sum の組み合わせを使えば、SQLにおける GROUP BY と COUNT(*) と同等の集計をMongoDBで簡単に実現できます。特定の値だけを抽出したい場合は、$match をパイプラインの先頭に追加することで、絞り込みを行った上で集計することも可能です。
-
MongoDBでドキュメント内の配列をGROUP BYし、重複する年齢値の出現回数を取得する方法
MongoDBの$group演算子で配列要素をグループ化するMongoDBでドキュメント内の配列をGROUP BY(グループ化)するには、集計パイプライン(aggregation pipeline)の $group 演算子を使用します。配列を個々のドキュメントに展開するために、$unwind と組み合わせるのが一般的な手法です。ここでは、各人物の名前と年齢を含む「details」配列を持つコレクションを作成し、同じ年齢が何回出現するかをカウントする例を見ていきましょう。1. コレクションの作成まず、insertOne() メソッドを使ってサンプルドキュメントを挿入します。> db.dem
-
MongoDBの集計パイプラインで点数が最も少ない2つのドキュメントを取得する方法
点数(Marks)の昇順に並べ替えたリストを取得するには $sort を使用します。さらに $limit: 2 を組み合わせることで、点数が最も少ない2件のドキュメントだけを表示できます。ここでは、実際に動作を確認できるよう、サンプル用のコレクションを作成していきましょう。1. サンプルコレクションの作成まずは insertOne() メソッドを使って、4件のドキュメントを登録します。> db.demo709.insertOne({Name:"John","Marks":75}); { "acknowledged