2016-06-27 5 views
2

다음 조건에 대해 고유 한 색인 @ mongoDB 생성을 도와 줄 수 있습니까?MongoDB의 고유 인덱스

는이 같은 스키마가 있다고 가정하고, 나는 3. "switches.name"4. "switches.value"

{ 
    "path": "somepath", 
    "verb": "GET", 
    "switches": [ 
    { 
     "name": "id", 
     "value":"123" 
    }, 
    { 
     "name": "age", 
     "value":"25" 
    } 
    ] 
} 

그래서 나는 경우 1.path 2.verb의 고유 복합 인덱스를 원하는 내가 중복 오류가 발생한다

{ 
    "path": "somepath", 
    "verb": "GET", 
    "switches": [ 
    { 
     "name": "id", 
     "value":"123" 
    }, 
    { 
     "name": "age", 
     "value":"25" 
    } 
    ] 
} 

를 삽입하려고하지만, 나는 삽입하는 경우

{ 
    "path": "somepath", 
    "verb": "GET", 
    "switches": [ 
    { 
     "name": "id", 
     "value":"123" 
    }, 
    { 
     "name": "age", 
     "value":"24" 
    } 
    ] 
} 

또는

오류가 발생하지 않습니다.

기본적으로 별개의 배열 "스위치"가있는 문서를 삽입 할 수 있어야합니다.

답변

3

달성하고자하는 것이 현재 스키마로는 될 수 없다는 것이 두렵다.

먼저 당신은 인덱스의 배열이 어떻게 작동하는지 이해해야한다 : 인덱스으로 https://docs.mongodb.com/manual/core/index-multikey/#multikey-indexes

배열 값을 유지하는 필드, MongoDB를 배열의 각 요소에 대한 인덱스 키를 만듭니다.

이 배열은 하나의 객체로 색인되지 않지만 여러 객체로을 풀리고 것을 제안합니다. 이를

db.yourCollection.createIndex({"path": 1, "verb": 1, "switches": 1}, {"unique": true}); 

그러나 :

{ 
    "path" : "somepath", 
    "verb" : "GET", 
    "switches" : { 
     "id": "123", 
     "age": "25" 
    } 
} 

을 그리고 평소와 같이 고유 인덱스를 만들 :

당신이 원하는 것과 비슷한 결과를 달성하기 위해, 당신은 대신 객체의 속성을 사용하여 맵을 고려할 수 있습니다 키를 쿼리하는 것이 중요하지 않기 때문에 일반적으로 바람직하지 않습니다.
(Also read about this here). 그래서 대안으로

, 대신 다른 개체 내에서 배열을 포장 할 수 있습니다

{ 
    "path" : "somepath", 
    "verb" : "GET", 
    "switches" : { 
     "options": [ 
      { 
       "name" : "id", 
       "value" : "123" 
      }, 
      { 
       "name" : "age", 
       "value" : "25" 
      } 
     ] 
    } 
} 

을 인덱스와 같은 :

db.yourCollection.createIndex({"path": 1, "verb": 1, "switches": 1}, {"unique": true}); 

을 당신이 switches.options 배열에 쿼리를 실행하려는 경우,이 것 더 바람직한 해결책. 당신이 원하는대로

+0

그러나 옵션에서 요소의 순서를 변경하면이 실패 "옵션"[ { "이름": "나이", "값": "25" }, { " 이름 ":"id ", "값 ":"123 " } ] 중복 오류가 발생하지 않습니다. – Abhijeet

+0

MongoDB 임베디드 문서 인덱스는 임베디드 문서 쿼리와 동일하게 작동합니다. 즉, 정확히 일치해야하고 필드 순서가 중요합니다. 멀티 키 인덱스가 작동하는 방식에 대한 사실을 추가하십시오. 필드 순서가 보장되지 않는다면 MongoDB 자체만으로는 유일성을 보장 할 수없는 것 같습니다. – kazenorin