고유한 필드 샤드 키 사용할 수 없거나 여러 필드에 대해 고유성을 시행하다 해야 하는 경우 프록시 컬렉션 역할을 할 다른 컬렉션 만듭니다.
이 작업에 대하여
샤딩된 클러스터 고유 인덱스 샤드 키 에 있거나 샤드 키 접두사로 포함하는 경우에만 샤드 간에 고유 제약 조건을 적용합니다. 프록시 컬렉션 컬렉션 원본 문서 에 대한 참조와 고유 키를 모두 포함하며 애플리케이션 프록시 컬렉션 에 먼저 기록합니다.
프록시 컬렉션 사용할 때는 다음 사항을 고려하세요.
프록시 컬렉션에 샤딩이 필요한 경우 고유성을 적용할 단일 필드를 샤딩해야 합니다.
각 필드 자체 프록시 컬렉션 필요합니다. 샤딩된 프록시 컬렉션을 사용하여 둘 이상의 필드 에 고유성을 시행하다 하려면 모든 필드 에 대해 하나의 프록시 컬렉션 있어야 합니다. 단일 프록시 컬렉션 에 여러 개의 고유 인덱스를 만드는 경우 프록시 컬렉션 샤드 할 수 없습니다.
이 접근 방식을 사용하려면 MongoDB 문서 삽입 시 자동으로 값을 생성하도록 하여 두 문서가 동일한
_id을 주식 하는 대신 애플리케이션 에서_id값을 생성해야 합니다.
샤딩된 컬렉션의 고유 인덱스에 적용 전체 제약 조건 설정하다 는 샤드 클러스터의 고유성 유지를 참조하세요.
시작하기 전에
고유한 제약 조건이 필요하지만 샤드 키 의 일부가 될 수 없는 필드 를 식별합니다.
필드 의 고유성 제약 조건을 위반하는 기존 문서가 없는지 확인합니다.
단계
사용자 정보를 저장하는 records 컬렉션 생각해 보겠습니다. email 필드 샤드 키 아니지만 고유해야 합니다. proxy 컬렉션 다음 필드가 포함되어 있습니다.
{ "_id" : ObjectId("..."), "email" : "<string>"}트랜잭션 에서 두 컬렉션에 모두 씁니다.
대상 필드 와 생성된 고유 ID 포함된 문서 proxy 컬렉션 에 삽입한 다음 전체 문서 records 컬렉션 에 삽입합니다. 트랜잭션 에서 두 삽입을 모두 실행하여 MongoDB 두 쓰기를 모두 적용하거나 둘 다 적용하지 않도록 합니다.
// Start a sessionsession = db.getMongo().startSession( { readPreference: { mode: "primary" } } );proxy = session.getDatabase( db.getName() ).proxy;records = session.getDatabase( db.getName() ).records;
var primary_id = ObjectId();
// Start a transactionsession.startTransaction( { readConcern: { level: "local" }, writeConcern: { w: "majority" } } );
// Operations inside the transactiontry { proxy.insertOne( { "_id" : primary_id, "email" : "example@example.net" } );
records.insertOne( { "_id" : primary_id, "email" : "example@example.net", // additional information... } );} catch (error) { // A duplicate email value fails the proxy insert and // cancels the transaction session.abortTransaction(); throw error;}// Commit the transaction using write concern set at transaction startsession.commitTransaction();session.endSession();email 값이 proxy 컬렉션 에 이미 존재하는 경우, 고유 인덱스 삽입을 거부하고 트랜잭션 이 중단되므로 records에 문서 추가되지 않습니다.