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

MongoDBでフィールドの重複する値を取得する方法【aggregate()の使い方】

MongoDBでフィールドの重複値を調べるには?

MongoDBにおいて、特定のフィールドに重複した値が存在するかどうかを確認したい場合は、aggregate()メソッドを使用します。集計パイプラインの「$group」と「$match」ステージを組み合わせることで、重複しているデータだけを効率よく抽出できます。

この記事では、実際にサンプルコレクションを作成しながら、重複値を検出する手順をわかりやすく解説します。

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

まず、以下のクエリを実行して、ドキュメントを含むコレクションを作成します。意図的に「John」「Larry」「Robert」などの名前を重複させています。

> db.findAllNonDistinctDemo.insertOne({"UserName":"John","UserAge":28});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c995078863d6ffd454bb647")
}
> db.findAllNonDistinctDemo.insertOne({"UserName":"Larry","UserAge":21});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c995081863d6ffd454bb648")
}
> db.findAllNonDistinctDemo.insertOne({"UserName":"Larry","UserAge":23});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c995089863d6ffd454bb649")
}
> db.findAllNonDistinctDemo.insertOne({"UserName":"David","UserAge":22});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c995093863d6ffd454bb64a")
}
> db.findAllNonDistinctDemo.insertOne({"UserName":"John","UserAge":26});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c99509d863d6ffd454bb64b")
}
> db.findAllNonDistinctDemo.insertOne({"UserName":"Robert","UserAge":24});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c9950a7863d6ffd454bb64c")
}
> db.findAllNonDistinctDemo.insertOne({"UserName":"Robert","UserAge":25});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c9950b1863d6ffd454bb64d")
}
> db.findAllNonDistinctDemo.insertOne({"UserName":"Mike","UserAge":29});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c9950bc863d6ffd454bb64e")
}

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

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

> db.findAllNonDistinctDemo.find().pretty();

実行すると、次のような出力が得られます。

{
    "_id" : ObjectId("5c995078863d6ffd454bb647"),
    "UserName" : "John",
    "UserAge" : 28
}
{
    "_id" : ObjectId("5c995081863d6ffd454bb648"),
    "UserName" : "Larry",
    "UserAge" : 21
}
{
    "_id" : ObjectId("5c995089863d6ffd454bb649"),
    "UserName" : "Larry",
    "UserAge" : 23
}
{
    "_id" : ObjectId("5c995093863d6ffd454bb64a"),
    "UserName" : "David",
    "UserAge" : 22
}
{
    "_id" : ObjectId("5c99509d863d6ffd454bb64b"),
    "UserName" : "John",
    "UserAge" : 26
}
{
    "_id" : ObjectId("5c9950a7863d6ffd454bb64c"),
    "UserName" : "Robert",
    "UserAge" : 24
}
{
    "_id" : ObjectId("5c9950b1863d6ffd454bb64d"),
    "UserName" : "Robert",
    "UserAge" : 25
}
{
    "_id" : ObjectId("5c9950bc863d6ffd454bb64e"),
    "UserName" : "Mike",
    "UserAge" : 29
}

ここから、「John」「Larry」「Robert」がそれぞれ2件ずつ登録されていることが目視でも確認できます。しかし、データ量が多い場合は目視での確認は現実的ではありません。そこでaggregate()の出番です。

3. aggregate()で重複値を抽出する

次のクエリを実行すると、MongoDB上のフィールドの重複値をすべて検出できます。

> db.findAllNonDistinctDemo.aggregate([
...     { "$group": {
...         "_id": "$UserName",
...         "Counter": { "$sum": 1 }
...     }},
...     { "$match": {
...         "Counter": { "$gt": 1 }
...     }}
... ]).pretty();

クエリの仕組み

  • $group:「$UserName」ごとにドキュメントをグループ化し、「Counter」フィールドで各グループの件数($sum: 1)をカウントします。
  • $match:「Counter」が1より大きい($gt: 1)グループ、つまり重複が存在する値のみを絞り込みます。

実行結果

出力は次のようになります。重複しているレコードだけが表示されているのがわかります。

{ "_id" : "Robert", "Counter" : 2 }
{ "_id" : "Larry", "Counter" : 2 }
{ "_id" : "John", "Counter" : 2 }

まとめ

MongoDBでフィールドの重複値を取得するには、aggregate()メソッドで「$group」により値ごとに件数を集計し、「$match」で件数が2以上のものを抽出するのが基本のアプローチです。この手法を応用すれば、特定フィールドのユニーク制約チェックやデータクレンジングなど、さまざまな場面で活用できます。「Counter」の条件を変更すれば、3件以上の重複だけを抽出することも可能なので、ぜひ試してみてください。

  1. MongoDBでフィールドの戻り値を制限するクエリの書き方($slice演算子の使い方)

    MongoDBでフィールドの戻り値を制限するクエリの書き方MongoDBで配列フィールドの要素数を制限して取得したい場合は、$slice演算子を使用します。この演算子を活用することで、クエリ結果として返す配列の要素数を柔軟にコントロールできます。ここでは、具体的な手順をサンプルコードとともに解説します。1. コレクションとドキュメントの作成まず、insertOne()メソッドを使ってドキュメントを挿入し、コレクションを作成します。> db.demo594.insertOne(...    {...    &n

  2. MongoDBで特定の文字列を使ってフィールドのすべての値を一括更新する方法

    MongoDBでフィールドのすべての値を一括更新する方法MongoDBのコレクション内に存在するすべてのドキュメントの特定フィールドを、同じ文字列でまとめて更新したい場合があります。そのようなときは、update()メソッドにオプション「multi: true」を指定します。この記事では、実際のコマンド例をもとに、手順をわかりやすく解説します。1. サンプルコレクションの作成まずはinsertOne()メソッドを使って、テスト用コレクション「demo720」に複数のドキュメントを挿入します。> db.demo720.insertOne({SubjectName:MySQL}); {