답변:
에 집계를 사용하여 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 }
-문장의 두 번째 부분은 결과를 필터링하는 것으로 충분하므로 여기서는 불필요합니다. 따라서 그룹이 있는지 확인하는 것만 가능 count > 1
합니다.
_id
필드를 확인하십시오 . group
작업 후에는 항상 null이 아님이 보장됩니다 .
_id
A로부터 문서의 $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 쿼리에 의해 처리됩니다.