복붙노트

[MONGODB] MongoDB를 중복 문서도 고유 키를 추가 한 후

MONGODB

MongoDB를 중복 문서도 고유 키를 추가 한 후

내가 컬렉션을 생성하고 다음과 같이 고유 키를 추가 한

db.user_services.createIndex({"uid":1 , "sid": 1},{unique:true,dropDups: true})

컬렉션은 다음과 같이 보입니다 "user_services"

{
 "_id" : ObjectId("55068b35f791c7f81000002d"),
 "uid" : 15,
 "sid" : 1,
 "rate" : 5
},
{

 "_id" : ObjectId("55068b35f791c7f81000002f"),
 "uid" : 15,
 "sid" : 1,
 "rate" : 4
}

문제 :

같은 UID 및 SID 문서를 삽입하는 PHP 드라이버를 사용하고 있으며 삽입지고 있습니다.

내가 원하는

해결법

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

    1.축하합니다, 당신은 버그를 발견 한 것으로 나타납니다. 이것은 단지 내 테스트에서 MongoDB를 3.0.0로 발생, 또는 적어도 MongoDB를 2.6.6에서 존재하지 않습니다. 버그는 이제 SERVER-17599 기록

    축하합니다, 당신은 버그를 발견 한 것으로 나타납니다. 이것은 단지 내 테스트에서 MongoDB를 3.0.0로 발생, 또는 적어도 MongoDB를 2.6.6에서 존재하지 않습니다. 버그는 이제 SERVER-17599 기록

    당신이 "복합 키"필드에 기존의 중복과 컬렉션이를 만들려고 할 때 문제가 인덱스를 생성 오류하지 않을 것입니다. 위에서 인덱스 생성은 쉘이를 산출한다 :

    {
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "errmsg" : "exception: E11000 duplicate key error dup key: { : 15.0, : 1.0 }",
        "code" : 11000,
        "ok" : 0
    }
    

    더 중복이없는 경우 현재 시도하고 당신이 인덱스를 만들 수 있습니다 제시하고 작성됩니다.

    그래서이 문제를 해결하려면, 먼저이 같은 절차에 중복 제거 :

    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})
    

    그러면 중복 데이터를 포함하는 상기 삽입물이 삽입되지 않으며, 적절한 오류가 기록 될 것이다.

    여기에 마지막 노트는 중복 데이터를 제거하는 "dropDups"는 것을 / 아니었다 아주 우아한 솔루션입니다. 당신은 정말 이상 입증 된 바와 같이 더 제어 뭔가를 원한다.

    두번째 부분보다는 용도를 취소하려면 ()에 .update를 () 메소드를 사용한다. 그것은 "upsert"옵션이

    $collection->update(
        array( "uid" => 1, "sid" => 1 ),
        array( '$set' => $someData ),
        array( 'upsert' => true )
    );
    

    이렇게 문서는 "수정"하고 찾을 수없는 문서가 "삽입"하는 "발견". 또한 수정하면 문서가 실제로 삽입되지 않은 경우 특정 데이터를 생성하는 방법을 $ setOnInsert를 참조하십시오.

    특정 시도를 들어, .update를 올바른 구문은 () 세 개의 인수입니다. "쿼리", "업데이트"와 "옵션"

    $collection->update(
        array( "uid" => 1, "sid" => 1 ),
        array(
            '$set' => array( "field" => "this" ),
            '$inc' => array( "counter" => 1 ),
            '$setOnInsert' => array( "newField" => "another" )
       ),
       array( "upsert" => true )
    );
    

    즉 "업데이트"문서의 섹션에 다른 업데이트 동작에서 사용되는 업데이트 작업 중에이 "액세스 동일한 경로"를 허용한다.

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

    2.키가 몽고에서 중복을 제거 - 현재 가장 인기있는 대답은 초등학교 MongoDB의 작업에 너무 로컬 및 자세한 조금입니다 같은 느낌.

    키가 몽고에서 중복을 제거 - 현재 가장 인기있는 대답은 초등학교 MongoDB의 작업에 너무 로컬 및 자세한 조금입니다 같은 느낌.

    > 몽고위한 키 3.0 중복을 제거하는 것은 간단하다. 그냥 yourDuplicateKey를 교체하고 _id 가정이 쿼리를 실행하면 기본 키 (방금 경우 mongodump 확인)입니다 :

    db.yourCollection.aggregate([
        { "$group": {
            "_id": { "yourDuplicateKey": "$yourDuplicateKey" },
            "dups": { "$push": "$_id" },
            "count": { "$sum": 1 }
        }},
        { "$match": { "count": { "$gt": 1 } }}
    ]).forEach(function(doc) {
        doc.dups.shift();
        db.yourCollection.remove({ "_id": {"$in": doc.dups }});
    });
    
  3. from https://stackoverflow.com/questions/29072209/mongodb-duplicate-documents-even-after-adding-unique-key by cc-by-sa and MIT license