2016-10-16 4 views
1

문서 샘플 : link카우치베이스 주식회사 N1QL 배열 쿼리

관련 JSON 페이스트

{ 
    "propertyCodes": { 
    "provider": [ 
     { 
     "code": [ 
      { 
      "value": [ 
       { 
       "value": "304387" 
       } 
      ] 
      } 
     ], 
     "providerCode": "hotelbeds", 
     "providerType": "gds" 
     }, 
     { 
     "code": [ 
      { 
      "value": [ 
       { 
       "name": "Country Code", 
       "value": "EG" 
       }, 
       { 
       "name": "City Code", 
       "value": "HRG" 
       }, 
       { 
       "name": "Hotel Code", 
       "value": "91U" 
       } 
      ] 
      } 
     ], 
     "providerCode": "gta", 
     "providerType": "gds" 
     } 
    ] 
    }, 
    "name": "Arabia Azur Resort" 
} 

나는 propertyCodes.provider.code.value.valuepropertyCodes.provider.providerCode을 기반으로 문서를 검색 쿼리 (및 인덱스)를합니다. 나는 각각 별도로 관리 할 수 ​​있지만 단일 쿼리에서 두 방법을 병합하는 방법을 잘 모르겠습니다.

SELECT meta().id FROM giata_properties AS gp USE INDEX(`#primary`) WHERE ANY v WITHIN gp.propertyCodes.provider[*].code SATISFIES v.`value` = '150613' END; 

SELECT meta().id FROM giata_properties AS gp USE INDEX(`#primary`) WHERE ANY v within gp.propertyCodes.provider[*].providerCode SATISFIES v = 'hotelbeds' END; 

그래서 예를 들어 나는 304387propertyCodes.provider.code.value.value을 포함하는 문서를 가져 오기 위해 원하는 코드 값이 문서를 통해 복제 할 수 있기 때문에 그 providerhotelbeds이지만, 코드와 providerCode 조합은 고유합니다.

+0

링크를 살펴보십시오. 이 질문에 단일 문서의 관련 섹션을 추가하십시오. – geraldss

답변

1

다음은 쿼리와 인덱스입니다.

쿼리.

SELECT META().id 
FROM giata_properties AS gp 
WHERE ANY p IN propertyCodes.provider SATISFIES (ANY v WITHIN p.code SATISFIES v.`value` = '304387' END) AND p.providerCode = 'hotelbeds' END; 

색인입니다.

CREATE INDEX idx_value ON giata_properties 
(DISTINCT ARRAY (DISTINCT ARRAY v.`value` FOR v WITHIN p.code END) FOR p IN propertyCodes.provider END); 

CREATE INDEX idx_providerCode ON giata_properties 
(DISTINCT ARRAY p.providerCode FOR p IN propertyCodes.provider END); 
+0

감사합니다. 쿼리와 인덱스가 훌륭하게 작동합니다. 궁금한 것은'idx_value'를 만들고 나서'EXPLAIN'은'idx_value'만으로 쿼리를 보여 주었고 꽤 빠르며'idx_providerCode'와'EXPLAIN'을 만들었습니다. 이제는 두 인덱스를 모두 사용하고 있습니다. 두 인덱스와 단일 인덱스를 사용하는 쿼리간에 성능 향상은 측정되지 않았습니다. 조금 설명해 주시겠습니까? 설명의 결과 http://pastebin.com/V1mk16iW – prettyvoid

+1

글쎄, IntersectScan은 무료가 아닙니다. 또한 인덱스가 동일한 노드에 있으면 리소스 (CPU, 메모리)를 공유하므로 속도가 향상되지 않을 수 있습니다. – geraldss

+0

내 질문에, 내 경우,'IntertersectScan'을 피하고'IndexScan'을 고집 할 수있는 단일 복합 색인을 만들 수 있습니까? – prettyvoid