2016-10-11 3 views
0

내부 객체의 내부 필드의 쿼리 내가 값을 기준으로 하나의 문서를 가져 오는 쿼리를 만들려고 해요이N1QL 중첩 된 JSON 배열

{ 
    "giata_properties": { 
     "propertyCodes": { 
     "provider": [ 
      { 
      "code": [ 
       { 
       "value": [ 
        { 
        "name": "Country Code", 
        "value": "EG" 
        }, 
        { 
        "name": "City Code", 
        "value": "HRG" 
        }, 
        { 
        "name": "Hotel Code", 
        "value": "91U" 
        } 
       ] 
       } 
      ], 
      "providerCode": "gta", 
      "providerType": "gds" 
      }, 
      { 
      "code": [ 
       { 
       "value": [ 
        { 
        "value": "071801" 
        } 
       ] 
       }, 
       { 
       "value": [ 
        { 
        "value": "766344" 
        } 
       ] 
       } 
      ], 
      "providerCode": "restel", 
      "providerType": "gds" 
      }, 
      { 
      "code": [ 
       { 
       "value": [ 
        { 
        "value": "HRG03Z" 
        } 
       ] 
       }, 
       { 
       "value": [ 
        { 
        "value": "HRG04Z" 
        } 
       ] 
       } 
      ], 
      "providerCode": "5VF", 
      "providerType": "tourOperator" 
      } 
     ] 
     } 
    } 
    } 

처럼 보이는 내 카우치베이스 주식회사 클러스터의 JSON 문서를 이고 구체적으로는 providerType입니다.

예를 들어, 내 입력은 071801restel이므로 위에 붙여 넣은 문서를 가져올 쿼리를 원합니다 (이 값이 포함되어 있기 때문에).

나는이 나에게 빈 결과 집합을 반환

SELECT * FROM giata_properties AS gp 
WHERE ANY `field` IN `gp.propertyCodes.provider.code.value` SATISFIES `field.value` = '071801' END; 

합니다 (providerType 입력없이) I는 지금까지 시도 그래서 뭐 N1QL 꽤 새로운 해요. 아마이 모든 일을 잘못하고있을거야.

EDIT1 :

는 geraldss 대답에 의하면 나는 2 개 개의 다른 쿼리

(보다 일반적인) ~2m50.9903732s

SELECT * FROM giata_properties AS gp WHERE ANY v WITHIN gp SATISFIES v.`value` = '071801' END; 

2 (보다 구체적인) ~2m31.3660388s 1을 통해 내 목표를 달성 할 수 있었다

SELECT * FROM giata_properties AS gp WHERE ANY v WITHIN gp.propertyCodes.provider[*].code SATISFIES v.`value` = '071801' END; 

버킷에는 약 550,000 개의 문서가 있습니다. 인덱스는 없지만 현재 기본 인덱스입니다.

질문 2 부

나는 위의 질의 중 하나를 수행 할 때, 나는 결과가 나는 엔진이 반복하는 걸쳐 완료 될 때까지 대기 질의 나머지 시간을 보내고, 매우 빠르게 내 껍질로 스트리밍 얻을 모든 서류. 나는, 내가

SELECT * FROM giata_properties AS gp WHERE ANY v WITHIN gp SATISFIES v.`value` = '071801' END LIMIT 1; 

같은 시도하지만 그 차이를하지 내가 첫 번째 결과에 따라서 엔진이 검색을 중지 LIMIT 1을 사용할 수 있습니다 생각 때문에 나는 단지 미래에서 질의 한 결과를 받고있을 거라고 확신 해요 내 셸에 문서를 작성한 다음 쿼리가 완전히 완료 될 때까지 대기합니다. 어떻게 올바르게 구성 할 수 있습니까?

EDIT2 : 나는 LIMIT 한 키워드와 함께 쿼리를 실행할 때, 난 단지 기본 인덱스가 giata_properties 양동이에 만든

내가 최근 기업 4.5.1-2844로 업그레이드 한, 그것은 여전히 ​​같은 시간이 걸립니다 , 더 빨리 멈추지 않습니다.

내가 제안한 배열 인덱스를 만들려고했는데 쿼리가 인덱스를 사용하지 않고 USE INDEX 절을 사용하더라도 #primary 인덱스를 계속 사용하려고합니다.

제안한 색인에서 SELF를 제거하려고 시도했지만 빌드하는 데 시간이 오래 걸렸으며 이제는이 새 색인을 사용할 수 있지만 솔직히 여기서 무엇을하는지 확신 할 수 없습니다.

그래서 3 질문 :

1) 당사 LIMIT 1 첫 번째 결과에서 쿼리 정지를하지 않습니다 차 인덱스를 사용하고 계십니까?

2) SELF를 사용하거나 사용하지 않고 제안한 색인의 차이점은 무엇입니까? 나는 SELF 키워드 문서를 찾으려고 노력했지만 아무 것도 찾을 수 없었다. 모두 인덱스가 웹 UI에서 어떻게 보이는지

입니다

인덱스 1 (원래 제안) -

CREATE INDEX `gp_idx1` ON `giata_properties`((distinct (array (`v`.`value`) for `v` within (array_star((((self.`giata_properties`).`propertyCodes`).`provider`)).`code`) end))) 

지수 2 (SELF없이) 작동하지

CREATE INDEX `gp_idx2` ON `giata_properties`((distinct (array (`v`.`value`) for `v` within (array_star(((self.`propertyCodes`).`provider`)).`code`) end))) 

3) 특정 검색어에 대한 검색어는 무엇입니까 giata_properties.propertyCodes.provider.code.value.value 특정 providerCode? 나는 둘 다 별도로 할 수 있었지만 나는 그들을 합병하는데 성공하지 못했다. 여기

+0

문서에 실제로 giata_properties 필드가 있습니까? – geraldss

+0

@ geraldss 아니요, 죄송합니다. 다음은'giata_properties' 버킷에있는 문서의 실제 샘플입니다. http://pastebin.com/mbXFMPkA – prettyvoid

+0

Ok, 이는 솔루션의 모든 불일치를 설명합니다. – geraldss

답변

1

사랑하는 모든 도움을

덕분에 providerType없는 쿼리입니다.

EXPLAIN SELECT * 
FROM giata_properties AS gp 
WHERE ANY v WITHIN gp.giata_properties.propertyCodes.provider[*].code SATISFIES v.`value` = '071801' END; 

또한 Couchbase 4.5.0 이상에서 색인을 생성 할 수 있습니다. 질문에 대답하는

CREATE INDEX idx1 ON giata_properties(DISTINCT ARRAY v.`value` FOR v WITHIN SELF.giata_properties.propertyCodes.provider[*].code END); 

편집 성능이 4.5.x.에서 해결 된

을 편집 Couchbase 4.5.1에서 다음을 시도하고 여기에 실행 시간을 게시해야합니다.

  • 4.5.1에서 테스트.
  • 색인을 만듭니다.
  • LIMIT을 사용하십시오. 4.5.1에서는 제한이 인덱스로 푸시 다운됩니다.
+0

고마워 geraldss, 그 작품과 정말 당신이 어떤 '가치'필드에서 당신을 언급하는 지정하지 않아도 좋네요 N1QL (그런데 성능에 영향을 미칩니 까?). 그러나 정확히 어떻게 N1QL에서 어떤 필드를 조사해야하는지 지정할 수 있습니까? 예를 들어,'gp.propertyCodes.provider.code.value.value' 만보기를 원하고'value'라는 이름을 가진 모든 필드를보기를 원치 않습니다. 또한 커뮤니티 에디션 4.1.0에서 제안한 인덱스를 수행 할 수 있습니까? – prettyvoid

+0

배열 인덱싱은 4.5 이상에서만 사용할 수 있습니다. 나는 좀 더 구체적으로 대답을 편집 할 것이다. – geraldss

+0

이 특정 쿼리가 이전보다 일반적인 성능보다 나은 성능을 제공하는지 궁금합니다. 곧 벤치 마크를 수행 할 것입니다. 고마워. – prettyvoid