web-dev-qa-db-ja.com

MongoDBで重複レコードを見つける

Mongoコレクションで重複フィールドを見つけるにはどうすればよいですか。

「名前」フィールドのいずれかが重複しているかどうかを確認したいと思います。

{
    "name" : "ksqn291",
    "__v" : 0,
    "_id" : ObjectId("540f346c3e7fc1054ffa7086"),
    "channel" : "Sales"
}

どうもありがとう!

84
Chris

nameで集計を使用し、count > 1nameを取得します。

db.collection.aggregate(
    {"$group" : { "_id": "$name", "count": { "$sum": 1 } } },
    {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } }, 
    {"$project": {"name" : "$_id", "_id" : 0} }
)

結果を重複の多い順に並べ替えるには:

db.collection.aggregate(
    {"$group" : { "_id": "$name", "count": { "$sum": 1 } } },
    {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } }, 
    {"$sort": {"count" : -1} },
    {"$project": {"name" : "$_id", "_id" : 0} }     
)

「name」以外の別の列名で使用するには、「$ name」を「$ column_name」に変更します

157
anhlc

次のlistパイプラインを使用して、duplicateaggregate名を見つけることができます。

  • Group同様のnameを持つすべてのレコード。
  • Matchそれらgroups1より大きいレコードを持っています。
  • 次に、groupを再度[projectとして、重複するすべての名前をarrayとして。

コード:

db.collection.aggregate([
{$group:{"_id":"$name","name":{$first:"$name"},"count":{$sum:1}}},
{$match:{"count":{$gt:1}}},
{$project:{"name":1,"_id":0}},
{$group:{"_id":null,"duplicateNames":{$Push:"$name"}}},
{$project:{"_id":0,"duplicateNames":1}}
])

o/p:

{ "duplicateNames" : [ "ksqn291", "ksqn29123213Test" ] }
20
BatScream

大きなデータベースがあり、一部のドキュメントにのみ属性名が存在する場合、anhicの回答は非常に非効率的です。

効率を改善するために、集計に$ matchを追加できます。

db.collection.aggregate(
    {"$match": {"name" :{ "$ne" : null } } }, 
    {"$group" : {"_id": "$name", "count": { "$sum": 1 } } },
    {"$match": {"count" : {"$gt": 1} } }, 
    {"$project": {"name" : "$_id", "_id" : 0} }
)
7
Juanín