고유한 필드 샤드 키 사용할 수 없거나 여러 필드에 대해 고유성을 시행하다 해야 하는 경우 프록시 컬렉션 역할을 할 다른 컬렉션 만듭니다.
이 작업에 대하여
샤딩된 클러스터 고유 인덱스 샤드 키 에 있거나 샤드 키 접두사로 포함하는 경우에만 샤드 간에 고유 제약 조건을 적용합니다. 프록시 컬렉션 컬렉션 원본 문서 에 대한 참조와 고유 키를 모두 포함하며 애플리케이션 프록시 컬렉션 에 먼저 기록합니다.
프록시 컬렉션 사용할 때는 다음 사항을 고려하세요.
애플리케이션 은 프록시 컬렉션 에 문서를 삽입할 때 오류를 포착해야 하며 두 컬렉션 간에 일관성 시행하다 해야 합니다.
프록시 컬렉션에 샤딩이 필요한 경우 고유성을 적용할 단일 필드를 샤딩해야 합니다.
각 필드 자체 프록시 컬렉션 필요합니다. 샤딩된 프록시 컬렉션을 사용하여 둘 이상의 필드 에 고유성을 시행하다 하려면 모든 필드 에 대해 하나의 프록시 컬렉션 있어야 합니다. 단일 프록시 컬렉션 에 여러 개의 고유 인덱스를 만드는 경우 프록시 컬렉션 샤드 할 수 없습니다.
이 접근 방식을 사용하려면 문서 삽입 시 MongoDB 자동으로 생성하도록 하는 대신
primary_id필드 에 대한 고유 ID 생성해야 합니다.
샤딩된 컬렉션의 고유 인덱스에 적용 전체 제약 조건 설정하다 는 샤드 클러스터의 고유성 유지를 참조하세요.
시작하기 전에
고유한 제약 조건이 필요하지만 샤드 키 의 일부가 될 수 없는 필드 를 식별합니다.
필드 의 고유성 제약 조건을 위반하는 기존 문서가 없는지 확인합니다.
단계
사용자 정보를 저장하는 records 컬렉션 생각해 보겠습니다. email 필드 샤드 키 아니지만 고유해야 합니다. proxy 컬렉션 다음 필드가 포함되어 있습니다.
{ "_id" : ObjectId("..."), "parent_id" : "<ID>", "email" : "<string>" }
기본 컬렉션 전에 프록시 컬렉션 에 씁니다.
대상 필드 와 생성된 고유 ID 포함된 문서 proxy 컬렉션 에 삽입합니다. 작업이 성공적인 하면 전체 문서 records 컬렉션 에 삽입합니다.
records = db.getCollection('records'); proxy = db.getCollection('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... })