2016-08-09 2 views
1

그래서 고유성을 검증하기 위해 MongoDB에서 검색 콜렉션을 작성해야합니다. 요구 사항은 동일한 2 개의 값이 반복되는지 확인하는 것입니다. SQL에서, 위 쿼리 수를 반환하면이사용자 정의 MongoDB 오브젝트 _id와 복합 인덱스

SELECT count(id) WHERE key1 = 'value1' AND key2 = 'value2' 

같은 그때는 조합이 고유하지 의미합니다. 나는 2 가지 솔루션을 염두에두고 있지만 어떤 것이 더 확장 성이 있는지 확신 할 수 없다. 이 매핑을 생성해야하는 30M + 문서가 있습니다.

Solution1

:

내가 키 1과 키 2에 복합 인덱스 문서의 컬렉션을 만들

{ 
    _id: <MongoID>, 
    key1: <value1>, 
    key2: <value2> 
} 

이 Solution2 :

내가 응용 프로그램 논리를 쓰기는 사용자 정의 연결하여 _ID 작성하려면 값 1 및 값 2

{ 
    _id: <value1>_<value2> 
} 

개인적으로 두 번째 인덱스는 단일 인덱스 만 있고 의사 크기가 더 작기 때문에 개인적으로 더 최적화되었습니다. 그러나 완전히 무작위가 아니기 때문에 자신의 _id 인덱스를 만드는 것이 좋은 방법인지 확실하지 않습니다. 어떻게 생각해?

미리 감사드립니다.

업데이트 :

내 데이터베이스가 이미 내가 특별히에만 고유성을 확인하는 데 사용되는 컬렉션을 위해 가능한 한 낮은 인덱스 크기를 유지 할 수 있도록 메모리를 차지 인덱스 많이있다.

+0

SQL 개수가 1보다 크고 값이 고유하지 않음을 의미합니까? 솔루션 2에서 MongoDB에 중복 값이로드되지 않습니다. 괜찮습니까? – notionquest

+0

아니요, SQL 개수가 0보다 커야한다는 의미였습니다. 1이라는 의미는 항목이 이미 있으므로 복제본을 추가해서는 안된다는 의미입니다. 솔루션 2의 경우 mongo가 정확하게 내가 원하는대로 중복을 추가하지 못하도록해도 괜찮습니다. – umair

답변

2

나는 솔루션을 필요한 경우 개별 필드에 의해 쉽게 검색 할 수있는 두 개의 다른 속성 키 1과 키 2

db.yourCollection.ensureIndex({ "key1": 1, "key2": 1 }, { unique: true }) 
  1. 을 복합 인덱스를 사용하고 사용하는 일 개 즉를 제안합니다. 즉 key1 또는 key2로만 검색해야하는 경우 복합 색인을 사용하면 쉽습니다. 키 조합으로 _id을 만들면 개별 필드로 검색하기가 어려워집니다.
  2. Mongo에있는 문서의 크기는 문서를 디자인 할 때 매우 괴롭습니다.
  3. 가까운 미래에 다른 값에 대해 같은 문서의 키 값을 변경해야한다면 쉽습니다. 다른 컬렉션의 문서에서이 문서에 대한 참조를 사용하고 있습니다.
  4. 확장 성 측면에서 보면 _id 인덱스는 순차적이며 쉽게 분할 할 수 있으며 MongoDB에서 관리 할 수 ​​있습니다.
  5. 이러한 키를 사용하여 검색하는 경우 해당 인덱스를 사용하고 그렇지 않으면 검색에 필요한 다른 인덱스를 사용합니다.

당신은 아직도 당신이 솔루션 1로 갈 수를 검색하는 것보다 문서의 크기 생각하는 경우에, 당신이 너무 특정 _id.key1를 검색 할 수 있습니다 이로써

{_id:{key1:<value1>,key2:<value2>}} 

같은 _id합니다.

업데이트 :

문서 크기가 유지보다 더 우려 경우 예. 그리고 열쇠가 같은 문서의 장래에 변경되지 않고, 다른 문서에서 참조를 가지고 있지 않다면, 솔루션 1을 사용할 수 있습니다. _보다 오브젝트를 키로 사용하십시오. 나중에 원하는 경우 나중에 키를 추가 할 수 있습니다.

+0

솔루션을 제공해 주셔서 감사합니다! 복합 인덱스가 더 많은 메모리를 차지하고 불필요한 추가 _id 인덱스가있을 것이라고 생각하지 마십시오. 필자의 경우에는 컬렉션이 value1 + value2가 반복되지 않도록하기 위해 단일 키를 쿼리하지 않을 것이다. – umair

+0

문제는 내 데이터베이스가 이미 많은 인덱스를 가지고있어 인덱스 크기를 가능한 한 작게 유지하려고한다는 것입니다. – umair

+0

@umair : 답변을 업데이트했습니다. –

1

나는 귀하의 요구에솔루션 2가 더 적합하다고 생각합니다. MongoDB의 _id 값을 생성하는 것은 절대적으로 좋습니다. 대부분의 응용 프로그램은 _id 값을 UUID로 채 웁니다. 이 컬렉션이 고유성 (즉, 임시 테이블의 종류) 또는 조회 목적을 확인하는 데 주로 사용된다고 가정하면 _id 값에 1과 2 값을 연결하는 것이 좋습니다.

해결책 1은 추가 색인이 필요하므로 값이 비쌉니다. 다시 말하지만,이 컬렉션을 사용하여 독창적 인 목적을 단독으로 확인하거나 다른 유스 케이스에도 사용할 것인지 여부에 따라 다릅니다.

중복 된 값에 대한 데이터를 삽입 할 수 없도록 고유 한 복합 인덱스를 만들어야합니다.

관련 문제