回答:
上の集約を使用name
して取得するname
とcount > 1
:
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」に変更します
"$match": {"_id" :{ "$ne" : null }
-ステートメントの2番目の部分は結果のフィルタリングで十分なので、ここでは不要です。だから、持っているグループをチェックするだけで十分count > 1
です。
_id
フィールドを確認してください。group
操作後は常にnullでないことが保証されます。
_id
以下からのドキュメントの$group
ステージはnullにすることができます。
名前の検索に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} }
)
db.getCollection('orders').aggregate([
{$group: {
_id: {name: "$name"},
uniqueIds: {$addToSet: "$_id"},
count: {$sum: 1}
}
},
{$match: {
count: {"$gt": 1}
}
}
])
最初のグループフィールドに従ってグループを照会します。
次に、一意のIDをチェックしてカウントします。countが1より大きい場合、フィールドはコレクション全体で重複しているため、$ matchクエリで処理されます。