'dropDups'를 사용하여 고유 키를 생성한 후에도 MongoDB 컬렉션에 중복 문서가 나타나는 이유는 무엇입니까?

DDD
풀어 주다: 2024-11-04 07:10:31
원래의
1059명이 탐색했습니다.

Why Am I Getting Duplicate Documents in My MongoDB Collection Even After Creating a Unique Key with `dropDups`?

고유 키 추가 후 MongoDB 중복 문서

문제 설명

" uid" 및 "sid" 필드, 중복 문서가 여전히 컬렉션에 삽입되고 있습니다.

기술 세부 정보

사용된 인덱스 생성 명령:

db.user_services.createIndex({"uid":1 , "sid": 1},{unique:true,dropDups: true})
로그인 후 복사

원인

컬렉션에 중복된 문서가 있어 인덱스 생성에 실패합니다. MongoDB 버전 3.0.0에서는 "dropDups" 옵션이 올바르게 작동하지 않아 이 문제가 발생합니다.

해결 방법

  • 중복 문서 제거 : 이 문제를 해결하려면 고유 인덱스를 생성하기 전에 중복 문서를 제거하세요. 이는 집계 및 제거 쿼리를 사용하여 달성할 수 있습니다.
db.events.aggregate([
    { "$group": {
        "_id": { "uid": "$uid", "sid": "$sid" },
        "dups": { "$push": "$_id" },
        "count": { "$sum": 1 }
    }},
    { "$match": { "count": { "$gt": 1 } }}
]).forEach(function(doc) {
    doc.dups.shift();
    db.events.remove({ "_id": {"$in": doc.dups }});
});
로그인 후 복사
  • 고유 인덱스 생성: 중복 항목을 제거한 후 의도한 대로 고유 인덱스를 생성합니다.
db.events.createIndex({"uid":1 , "sid": 1},{unique:true})
로그인 후 복사

Upsert 작업

질문의 두 번째 부분에서는 기존 데이터의 존재를 기반으로 문서를 삽입하거나 업데이트하는 원하는 동작을 달성하기 위해 , "upsert" 옵션과 함께 ".update()" 메서드를 사용하세요.

$collection->update(
    array( "uid" => 1, "sid" => 1 ),
    array( '$set' => $someData ),
    array( 'upsert' => true )
);
로그인 후 복사

이렇게 하면 발견된 문서가 수정되고 필요에 따라 새 문서가 삽입됩니다. 또한 "$setOnInsert"를 사용하여 문서 삽입 중에만 설정해야 하는 필드를 지정할 수 있습니다.

위 내용은 'dropDups'를 사용하여 고유 키를 생성한 후에도 MongoDB 컬렉션에 중복 문서가 나타나는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿