임의 필드에 대한 고유 제약 조건
이 페이지의 내용
고유한 필드 를 샤드 키 사용할 수 없거나 여러 필드에 대해 고유성을 시행하다 해야 하는 경우 '프록시 컬렉션 ' 역할을 하는 다른 컬렉션 을 만들어야 합니다. 이 컬렉션 에는 원본 문서 에 대한 참조(예: ObjectId
)와 고유 키가 모두 포함되어야 합니다.
사용자 정보를 저장하는 records
컬렉션을 생각해 보겠습니다. email
필드는 샤드 키가 아니지만 고유성을 보유해야 합니다.
그러면 proxy
컬렉션에 다음이 포함됩니다.
{ "_id" : ObjectId("...") "parent_id" : "<ID>" "email" : "<string>" }
다음 명령어를 사용하여 email
필드에 고유 인덱스을 생성합니다.
db.proxy.createIndex( { "email" : 1 }, { unique : true } )
다음 예시에서는 먼저 대상 필드와 생성된 고유 ID가 포함된 문서를 proxy
컬렉션에 삽입하고자 합니다. 작업이 성공하면 전체 문서를 records
컬렉션에 삽입합니다.
records = db.getSiblingDB('records'); proxy = db.getSiblingDB('proxy'); var primary_id = ObjectId(); proxy.insertOne({ "_id" : primary_id "email" : "example@example.net" }) // if: the above operation returns successfully, // then continue: records.insertOne({ "_id" : primary_id "email": "example@example.net" // additional information... })
이 방법을 사용하려면 MongoDB가 문서 삽입 시 자동으로 ID를 생성하는 대신 primary_id
필드의 고유 ID를 만들어야 합니다.
여러 필드에 고유성을 적용하려면 각 필드마다 프록시 컬렉션이 필요합니다.
고려 사항
애플리케이션은 '프록시' 컬렉션에 문서를 삽입할 때 오류를 파악하고 두 컬렉션의 일관성을 적용해야 합니다.
프록시 컬렉션에 샤딩이 필요한 경우 고유성을 적용할 단일 필드를 샤딩해야 합니다.
샤딩된 프록시 컬렉션을 이용하여 하나 이상의 필드에 고유성을 적용하려면 고유성을 적용할 모든 필드에 대한 하나의 프록시 컬렉션을 보유해 합니다. 단일 프록시 컬렉션에 여러 개의 고유 인덱스를 만들면 이를 샤딩할 수 없습니다.