2013-04-17 3 views
4

MongoDB는 희귀 고유 복합 인덱스를 지원하지 않기 때문에 해결 방법이 필요합니다 (존재하지 않으면 값을 null으로 설정하지만 인덱스가없는 인덱스는 필드에 추가하지 않습니다) 비 복합 지수). https://jira.mongodb.org/browse/SERVER-2193지원되지 않는 희귀 고유 복합 인덱스에 대한 MongoDB 해결 방법

내 경우에는 내가 events입니다. 그들은 한 번 또는 반복 될 수 있습니다. 나는 이벤트가 반복 이벤트의 인스턴스 일 때만 존재하는 필드 parent을 가지고 있습니다 (정기적으로 시스템의 다음 주 동안 반복 이벤트를 갖기 위해 부모의 새 복사본을 주기적으로 생성합니다).

나는 복합 인덱스에 sparse을 지원하지 않습니다 MongoDB를 위에서 말했듯 cronjob를 불행하게도 두 번

events.ensureIndex({ dateFrom: 1, dateTo: 1, parent: 1 }) { sparse: true, unique: true } 

을 실행할 때 난 그냥 중복 사본을 방지하기 위해이 인덱스를 추가 할 거라고 생각했다. 즉, 일회성 이벤트의 경우 parent 필드가 존재하지 않으며 MongoDB에서 null으로 설정됩니다. 같은 시간에 두 번째 일회성 이벤트가 생기면 중복 키 오류가 발생합니다. 상위 오류가 발생했을 때만 원하는 오류가 발생합니다.

아이디어가 있으십니까?

편집 : MongoDB: Unique and sparse compound indexes with sparse values을 보았지만 응용 프로그램 수준에서 고유성을 검사하는 것은 아무런 의미가 없습니다. 나는 그것이 데이터베이스가 존재하는 것을 의미합니다. 유일성을 보장합니다.

+0

가능한 속담 https://stackoverflow.com/questions/45675385/mongodb-compound-sparse-indexes – JohnnyHK

답변

0

dateFrom + dateTo + parent (문자열 연결) 일 수있는 네 번째 필드를 추가 할 수 있습니다. 부모가 null 인 경우, 예를 들어 ObjectId 함수에서 uid를 선택한 다음 해당 필드를 고유하게 색인화하십시오.

이렇게하면 원하는 고유성을 적용 할 수 있습니다. 그러나이 제약 조건을 적용하는 것 이외의 다른 용도로는 사용할 수 없습니다. ("문자열이 어쩌구로 시작하는지 문서를 얻는 것과 같은 쿼리"는 매우 효율적일 수 있습니다.)

+0

꽤 아니지만 아마 일할 것입니다. 그러나 인덱스에 도메인 특정 필드를 추가하여 다른 해결 방법을 사용할 수 있었지만 내 경우에는 의미가있었습니다. 나는 이벤트의'title'을 추가했는데, 나는 동시에 두 개의 이벤트에 문제가 없다. (나는 창조자/사용자도 추가했다.) – Prinzhorn

관련 문제