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

MongoDBで重複するドキュメントをグループ化する方法:aggregate()を使った実践ガイド

MongoDBで重複ドキュメントをグループ化するには

MongoDBで重複しているドキュメントをグループ化したい場合は、aggregate()メソッド$groupステージを組み合わせて使用します。SQLにおける「GROUP BY」句と同様の処理を、MongoDBの集計パイプラインで実現できます。

この記事では、実際にコレクションを作成し、重複する値を持つドキュメントをグループ化する手順を順を追って解説します。

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

まず、insertOne()メソッドを使って、意図的に重複する値を含むコレクション「demo501」を作成します。

> db.demo501.insertOne({"Name":"Chris"});{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e8752f0987b6e0e9d18f566")
}
> db.demo501.insertOne({"Name":"Bob"});{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e8752f4987b6e0e9d18f567")
}
> db.demo501.insertOne({"Name":"Chris"});{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e8752f8987b6e0e9d18f568")
}
> db.demo501.insertOne({"Name":"John"});{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e8752fb987b6e0e9d18f569")
}
> db.demo501.insertOne({"Name":"Chris"});{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e8752fd987b6e0e9d18f56a")
}
> db.demo501.insertOne({"Name":"John"});{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e875301987b6e0e9d18f56b")
}
> db.demo501.insertOne({"Name":"David"});{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e875307987b6e0e9d18f56c")
}

上記の例では、「Chris」が3件、「John」が2件と重複したデータが登録されています。

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

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

> db.demo501.find();

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

{ "_id" : ObjectId("5e8752f0987b6e0e9d18f566"), "Name" : "Chris" }
{ "_id" : ObjectId("5e8752f4987b6e0e9d18f567"), "Name" : "Bob" }
{ "_id" : ObjectId("5e8752f8987b6e0e9d18f568"), "Name" : "Chris" }
{ "_id" : ObjectId("5e8752fb987b6e0e9d18f569"), "Name" : "John" }
{ "_id" : ObjectId("5e8752fd987b6e0e9d18f56a"), "Name" : "Chris" }
{ "_id" : ObjectId("5e875301987b6e0e9d18f56b"), "Name" : "John" }
{ "_id" : ObjectId("5e875307987b6e0e9d18f56c"), "Name" : "David" }

3. 重複ドキュメントをグループ化するクエリ

それでは、重複するドキュメントをグループ化するクエリを見ていきましょう。aggregate()メソッドのパイプライン内で$groupステージを指定し、_idフィールドに「$Name」を設定することで、Nameフィールドの値ごとにドキュメントがグループ化されます。

> db.demo501.aggregate( [ { $group : { _id : "$Name" } } ] )

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

{ "_id" : "David" }
{ "_id" : "John" }
{ "_id" : "Bob" }
{ "_id" : "Chris" }

実行結果のポイント

出力結果を見ると、重複していた「Chris」「John」がそれぞれ1つにまとめられ、コレクション内に存在する一意なNameの値だけが返されていることがわかります。なお、グループ化された結果の表示順序は保証されないため、特定の順序で取得したい場合は、パイプラインに$sortステージを追加するとよいでしょう。

さらに、$groupステージでは$sum$countなどのアキュムレータ演算子を組み合わせることで、各グループの出現回数を集計することも可能です。例えば、以下のように記述します。

> db.demo501.aggregate([
    { $group : { _id : "$Name", total : { $sum : 1 } } }
])

このようにaggregate()と$groupを活用することで、MongoDBでも柔軟に重複データのグループ化や集計処理を行うことができます。

  1. MongoDBの$groupと$sumを使ってドキュメント内の重複データの出現回数を取得する方法

    MongoDBでグループ集計を行い、同じ値が何回出現しているか(重複回数)を取得したい場合は、集計パイプラインの $group 演算子と $sum 演算子を組み合わせるのが定番の手法です。1. サンプルコレクションの作成まず、動作確認用に「Marks(点数)」フィールドを持つドキュメントをいくつか挿入したコレクションを作成します。> db.demo676.insertOne({Marks:87}); { acknowledged : true, insertedId : ObjectId(5ea41eed04263e90dac943f2) } > db.demo67

  2. MongoDBで埋め込みドキュメント(配列内のサブドキュメント)をクエリする方法

    MongoDBの埋め込みドキュメントをクエリするには?MongoDBでは、ドキュメントの中に配列として埋め込まれたサブドキュメントをクエリする場合、aggregate()メソッドを使用するのが効果的です。この記事では、$unwindと$matchを組み合わせて、埋め込みドキュメントから条件に合うデータを抽出する手順を解説します。1. サンプルコレクションの作成まずは、学生情報を配列として持つドキュメントを含むコレクションを作成しましょう。insertOne()メソッドを使ってドキュメントを挿入します。> db.demo705.insertOne( ... { ...