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

MongoDBで重複レコードを検索する方法|aggregateフレームワークの使い方を解説

MongoDBで重複レコードを見つけたい場合は、aggregate(集計)フレームワークを利用するのが効果的です。この記事では、実際にサンプルコレクションを作成しながら、重複データを検出するクエリの書き方を段階的に解説します。

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

まずは動作確認用のコレクションを作成しましょう。insertOne()メソッドを使って、ドキュメントを1件ずつ登録していきます。

> db.findDuplicateRecordsDemo.insertOne({"StudentFirstName":"John"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a330293b406bd3df60e01")
}
> db.findDuplicateRecordsDemo.insertOne({"StudentFirstName":"John"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a330493b406bd3df60e02")
}
> db.findDuplicateRecordsDemo.insertOne({"StudentFirstName":"Carol"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a330c93b406bd3df60e03")
}
> db.findDuplicateRecordsDemo.insertOne({"StudentFirstName":"Sam"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a331093b406bd3df60e04")
}
> db.findDuplicateRecordsDemo.insertOne({"StudentFirstName":"Carol"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a331593b406bd3df60e05")
}
> db.findDuplicateRecordsDemo.insertOne({"StudentFirstName":"Mike"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a331e93b406bd3df60e06")
}

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

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

> db.findDuplicateRecordsDemo.find();

実行結果は次のとおりです。この時点で「John」と「Carol」がそれぞれ2件ずつ登録されていることが分かります。

{ "_id" : ObjectId("5c8a330293b406bd3df60e01"), "StudentFirstName" : "John" }
{ "_id" : ObjectId("5c8a330493b406bd3df60e02"), "StudentFirstName" : "John" }
{ "_id" : ObjectId("5c8a330c93b406bd3df60e03"), "StudentFirstName" : "Carol" }
{ "_id" : ObjectId("5c8a331093b406bd3df60e04"), "StudentFirstName" : "Sam" }
{ "_id" : ObjectId("5c8a331593b406bd3df60e05"), "StudentFirstName" : "Carol" }
{ "_id" : ObjectId("5c8a331e93b406bd3df60e06"), "StudentFirstName" : "Mike" }

3. 重複レコードを検出するaggregateクエリ

重複レコードの検出には、aggregate()メソッドで次の3つのパイプラインステージを組み合わせます。

  • $group:StudentFirstNameの値ごとにドキュメントをグループ化し、$sumで各グループの件数をカウントします。
  • $match:_idがnullではなく、かつcountが1より大きい(=重複している)グループのみを抽出します。
  • $project:出力結果を整形し、_idを除外してStudentFirstNameのみを表示します。
> db.findDuplicateRecordsDemo.aggregate(
    {"$group" : { "_id": "$StudentFirstName", "count": { "$sum": 1 } } },
    {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } },
    {"$project": {"StudentFirstName" : "$_id", "_id" : 0} }
);

実行結果には、重複しているレコードのみが表示されます。

{ "StudentFirstName" : "Carol" }
{ "StudentFirstName" : "John" }

まとめ

このように、aggregateフレームワークの$group・$match・$projectを組み合わせることで、MongoDB内の重複レコードをシンプルなクエリで特定できます。データのクレンジングや品質チェック、ユニーク制約を導入する前の調査などに、ぜひ活用してみてください。

  1. 【MongoDB入門】find()で条件に基づくレコード検索を行う方法

    MongoDBで特定の条件に一致するドキュメント(レコード)を取得したい場合、find()メソッドに検索条件を指定するだけで実現できます。本記事では、サンプルコレクションを作成し、条件を指定してデータを検索する手順を実際のコード例とともに解説します。1. サンプルコレクションの作成まず、insertOne()メソッドを使って、テスト用のコレクション「demo708」に複数のドキュメントを挿入します。> db.demo708.insertOne({Name:John,Marks:54}); { acknowledged : true, insertedId : Object

  2. MySQLで重複レコードを検索・表示する方法【サンプル付きで解説】

    データベースを運用していると、同じ値が複数行に登録されている「重複レコード」を確認したい場面があります。本記事では、MySQLのGROUP BY句とHAVING句を組み合わせることで、テーブル内の重複データを簡単に見つけて表示する方法を、実際のSQL文と実行結果とともに順を追って解説します。 1. サンプルテーブルの作成 まず、CREATE TABLE文を使って検証用のテーブルを作成します。ここではID、名前(Name)、所在地(Location)の3つのカラムを持つテーブルを用意しました。 mysql> CREATE table DuplicateFound -> ( ->