복붙노트

[MONGODB] 어떻게하여 MongoDB의 핵심 기반으로 중복을 제거하는 방법?

MONGODB

어떻게하여 MongoDB의 핵심 기반으로 중복을 제거하는 방법?

나는 주변에있다하여 MongoDB의 모음 (~ 3 개 백만 레코드)이있다. 내 샘플 기록은 같을 것이다

 { "_id" = ObjectId("50731xxxxxxxxxxxxxxxxxxxx"),
   "source_references" : [
                           "_id" : ObjectId("5045xxxxxxxxxxxxxx"),
                           "name" : "xxx",
                           "key" : 123
                          ]
 }

나는 같은 source_references.key를 가진 컬렉션에 중복 레코드의 많은 데. (중복 I으로 source_references.key하지 _id을 의미).

내가 source_references.key에 따라 중복 레코드를 제거하려면, 나는 각 레코드를 통과하고있는 경우 기록을 제거하기 위해 일부 PHP 코드를 작성 생각 해요.

몽고 내부 명령 행에서 중복을 제거 할 수있는 방법이 있습니까?

해결법

  1. ==============================

    1.MongoDB를 2.6 이상에서 진정한 인덱스 생성 옵션 : 당신이 source_references.key 식별 레코드를 복제 것이 확실한 경우에는 dropDups와 고유 인덱스를 보장 할 수 있습니다 :

    MongoDB를 2.6 이상에서 진정한 인덱스 생성 옵션 : 당신이 source_references.key 식별 레코드를 복제 것이 확실한 경우에는 dropDups와 고유 인덱스를 보장 할 수 있습니다 :

    db.things.ensureIndex({'source_references.key' : 1}, {unique : true, dropDups : true})
    

    이것은 각 source_references.key 값의 첫 번째 고유의 문서를 유지하고, 그렇지 않으면 중복 키 위반이 발생할 것이다 후속 문서를 삭제합니다.

    중요 사항 :

    명백한주의 : 데이터베이스의 백업을 가지고, 당신이 의도하지 않은 데이터 손실에 대해 우려하는 경우 먼저 스테이징 환경에서 이것을 시도.

  2. ==============================

    2.이것은 내 MongoDB를 3.2에 사용되는 가장 쉬운 쿼리 I입니다

    이것은 내 MongoDB를 3.2에 사용되는 가장 쉬운 쿼리 I입니다

    db.myCollection.find({}, {myCustomKey:1}).sort({_id:1}).forEach(function(doc){
        db.myCollection.remove({_id:{$gt:doc._id}, myCustomKey:doc.myCustomKey});
    })
    

    속도를 높이기 위해이 프로그램을 실행하기 전에 색인은 customKey

  3. ==============================

    3.Stennie의 유효한 대답은 @ 있지만, 그것은 유일한 방법은 아니다. MongoDB의 설명서가 당신을 요청 가리키고 그 일을하는 동안 매우 신중해야합니다. 다른 두 가지 옵션이 있습니다

    Stennie의 유효한 대답은 @ 있지만, 그것은 유일한 방법은 아니다. MongoDB의 설명서가 당신을 요청 가리키고 그 일을하는 동안 매우 신중해야합니다. 다른 두 가지 옵션이 있습니다

  4. ==============================

    4.여기 일을 조금 더 '매뉴얼'방법입니다 :

    여기 일을 조금 더 '매뉴얼'방법입니다 :

    기본적으로, 첫째, 당신이 관심이있는 모든 고유 키의 목록을 가져옵니다.

    그리고 그 각각의 키를 사용하여 검색을 수행하고보다 경우가 해당 검색 반환 더 큰 삭제합니다.

        db.collection.distinct("key").forEach((num)=>{
          var i = 0;
          db.collection.find({key: num}).forEach((doc)=>{
            if (i)   db.collection.remove({key: num}, { justOne: true })
            i++
          })
        });
    
  5. ==============================

    5.핍 mongo_remove_duplicate_indexes 설치

    핍 mongo_remove_duplicate_indexes 설치

    더 나은 이해를 위해 mongo_remove_duplicate_indexes의 패키지 소스 코드를 체크 아웃

  6. ==============================

    6.메모리가 충분한 경우 스칼라에서 그런 일을 할 수 있습니다 :

    메모리가 충분한 경우 스칼라에서 그런 일을 할 수 있습니다 :

    cole.find().groupBy(_.customField).filter(_._2.size>1).map(_._2.tail).flatten.map(_.id)
    .foreach(x=>cole.remove({id $eq x})
    
  7. from https://stackoverflow.com/questions/13190370/how-to-remove-duplicates-based-on-a-key-in-mongodb by cc-by-sa and MIT license