Mongoコレクションで重複フィールドを見つけるにはどうすればよいですか。
「名前」フィールドのいずれかが重複しているかどうかを確認したいと思います。
{
"name" : "ksqn291",
"__v" : 0,
"_id" : ObjectId("540f346c3e7fc1054ffa7086"),
"channel" : "Sales"
}
どうもありがとう!
name
で集計を使用し、count > 1
でname
を取得します。
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」に変更します
次のlist
パイプラインを使用して、duplicate
のaggregate
名を見つけることができます。
Group
同様のname
を持つすべてのレコード。Match
それらgroups
は1
より大きいレコードを持っています。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" ] }
大きなデータベースがあり、一部のドキュメントにのみ属性名が存在する場合、anhicの回答は非常に非効率的です。
効率を改善するために、集計に$ matchを追加できます。
db.collection.aggregate(
{"$match": {"name" :{ "$ne" : null } } },
{"$group" : {"_id": "$name", "count": { "$sum": 1 } } },
{"$match": {"count" : {"$gt": 1} } },
{"$project": {"name" : "$_id", "_id" : 0} }
)