MongoDB에서 중복 레코드 찾기


116

mongo 컬렉션에서 중복 필드를 어떻게 찾을 수 있습니까?

"이름"필드가 중복되는지 확인하고 싶습니다.

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

감사합니다!


5
이 질문에 대한 중복 플래그는 자격이 없습니다. 이 질문은 중복 기록을 방지하는 것이 아니라 찾는 방법을 묻습니다.
Harry King

답변:


210

에 집계를 사용하여 name얻을 namecount > 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 "으로 변경하십시오.


1
"$match": {"_id" :{ "$ne" : null } -문장의 두 번째 부분은 결과를 필터링하는 것으로 충분하므로 여기서는 불필요합니다. 따라서 그룹이 있는지 확인하는 것만 가능 count > 1합니다.
BatScream 2014

5
Tks @BatScream. { "$ ne": null} 'name'이 null이거나 존재하지 않는 경우에만 있습니다. 집계도 null로 계산됩니다.
anhlc 2014

1
어서 오십시오. 하지만 왜 _id필드를 확인하십시오 . group작업 후에는 항상 null이 아님이 보장됩니다 .
BatScream 2014

4
_idA로부터 문서의 $group단계는 널 (null)이 될 수 있습니다.
wdberkeley 2014

1
이것의 결과는 무엇입니까? 내가 실행하면 내가 필요한 모든 문서를 얻는 것은 중복 된 ID / 이름 만 원한다는 것입니다.
Kannan T

24

당신은 찾을 수 listduplicate다음과 같은 사용하여 이름 aggregate파이프 라인 :

  • Group유사한 name.
  • Matchgroups보다 더 가진 기록보다 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" ] }

10

큰 데이터베이스가 있고 속성 이름이 일부 문서에만있는 경우 anhic이 제공 한 대답은 매우 비효율적 일 수 있습니다.

효율성을 높이기 위해 집계에 $ match를 추가 할 수 있습니다.

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

3
db.getCollection('orders').aggregate([  
    {$group: { 
            _id: {name: "$name"},
            uniqueIds: {$addToSet: "$_id"},
            count: {$sum: 1}
        } 
    },
    {$match: { 
        count: {"$gt": 1}
        }
    }
])

첫 번째 그룹 필드에 따라 그룹을 쿼리합니다.

그런 다음 고유 ID를 확인하고 계산합니다. count가 1보다 크면 필드가 전체 컬렉션에서 중복되므로 $ match 쿼리에 의해 처리됩니다.


1
이것도 저에게 효과가 있도록 만들 수 없었습니다. 반대 투표!
Mathieu G

이 게시물은 오래되었지만 도움이 될 수 있습니다. 이것을 확인하십시오. 내 로컬에서 작동하는지 확인할 것입니다. 나는 이것에 대해 하나의 블로그를 보았습니다. 한번 봐주세요. compose.com/articles/finding-duplicate-documents-in-mongodb
Aman shrivastava

나는 그것을 작동시킬 수 있었다-확인 된 작동 버전으로 업데이트하도록 편집했다.
AL Strine
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.