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内の重複レコードをシンプルなクエリで特定できます。データのクレンジングや品質チェック、ユニーク制約を導入する前の調査などに、ぜひ活用してみてください。
-
【MongoDB入門】find()で条件に基づくレコード検索を行う方法
MongoDBで特定の条件に一致するドキュメント(レコード)を取得したい場合、find()メソッドに検索条件を指定するだけで実現できます。本記事では、サンプルコレクションを作成し、条件を指定してデータを検索する手順を実際のコード例とともに解説します。1. サンプルコレクションの作成まず、insertOne()メソッドを使って、テスト用のコレクション「demo708」に複数のドキュメントを挿入します。> db.demo708.insertOne({Name:John,Marks:54}); { acknowledged : true, insertedId : Object
-
MySQLで重複レコードを検索・表示する方法【サンプル付きで解説】
データベースを運用していると、同じ値が複数行に登録されている「重複レコード」を確認したい場面があります。本記事では、MySQLのGROUP BY句とHAVING句を組み合わせることで、テーブル内の重複データを簡単に見つけて表示する方法を、実際のSQL文と実行結果とともに順を追って解説します。 1. サンプルテーブルの作成 まず、CREATE TABLE文を使って検証用のテーブルを作成します。ここではID、名前(Name)、所在地(Location)の3つのカラムを持つテーブルを用意しました。 mysql> CREATE table DuplicateFound -> ( ->