[MONGODB] MongoDB를 중복 문서도 고유 키를 추가 한 후
MONGODBMongoDB를 중복 문서도 고유 키를 추가 한 후
내가 컬렉션을 생성하고 다음과 같이 고유 키를 추가 한
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.축하합니다, 당신은 버그를 발견 한 것으로 나타납니다. 이것은 단지 내 테스트에서 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.키가 몽고에서 중복을 제거 - 현재 가장 인기있는 대답은 초등학교 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 }}); });
from https://stackoverflow.com/questions/29072209/mongodb-duplicate-documents-even-after-adding-unique-key by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 어떻게 Windows 서비스로 MongoDB의를 실행할 수 있습니까? (0) | 2019.12.03 |
---|---|
[MONGODB] 위치`$ '연산자의 다중 사용은 중첩 된 배열을 업데이트 (0) | 2019.12.03 |
[MONGODB] 배열의 모든 요소가 조건에 일치하는 경우 확인 (0) | 2019.12.02 |
[MONGODB] 왜 Node.js를 코드에서 MongoDB를 연결 어느 곳을 폐쇄하지 않는 것이 좋습니다? (0) | 2019.12.02 |
[MONGODB] 오버플로 정렬 단계 버퍼링 된 데이터의 사용은 내부 한계를 초과 (0) | 2019.12.02 |