2016-06-23 3 views
1

CouchBase (4.1.1)에서 N1QL은 전체 요소를 사용하여 색인을 생성 할 수 있습니다.이 두 예제를 사용하십시오. 수 있다는 점이다CouchBase 색인 중첩 요소

{ 
    "name": "blah", 
    "credentials": [ 
     { 
      "level": 5, 
      "sector": "XP" 
     } 
    ], 
} 

이제 우리는 오프 이름과 전체 자격 증명 요소의 기반 index1의를 만들고 싶었 말 :

우리가이 문서 구조를 갖고 있다고?

뭔가 이름과 레벨 등의 중첩 된 필드 중 하나의 기반으로

create index indexName on `bucketName` (name, credentials) USING GSI; 

또는 index2

같은; 어떻게이 일을 할 수 있니?

create index indexName on `bucketName`(name, credential.levels) USING GSI; 

같은 내 보조 인덱스가이 버킷에 대한 기본 인덱스로 사용 카우치베이스 주식회사 기본값되지 않는 설명 실행.

여기에 제가 사용하는 선택입니다. 여기에서 생산되는

select s.name, s.credentials 
from `security` unnest s.credentials 
where credentials is not missing and name = 'tom'; 

설명 :

{ 
    "requestID": "f8d46eeb-3898-4ace-a24f-1582e0504eb7", 
    "signature": "json", 
    "results": [ 
     { 
      "#operator": "Sequence", 
      "~children": [ 
       { 
        "#operator": "PrimaryScan", 
        "index": "#primary", 
        "keyspace": "read", 
        "namespace": "default", 
        "using": "gsi" 
       }, 
       { 
        "#operator": "Parallel", 
        "~child": { 
         "#operator": "Sequence", 
         "~children": [ 
          { 
           "#operator": "Fetch", 
           "as": "s", 
           "keyspace": "bucketName", 
           "namespace": "default" 
          }, 
          { 
           "#operator": "Unnest", 
           "as": "beacons", 
           "expr": "(`s`.`credentials`)" 
          }, 
          { 
           "#operator": "Filter", 
           "condition": "((`s`.`name`) = \"tom\")" 
          }, 
          { 
           "#operator": "InitialProject", 
           "result_terms": [ 
            { 
             "expr": "(`s`.`id`)" 
            }, 
            { 
             "expr": "`credentials`" 
            } 
           ] 
          }, 
          { 
           "#operator": "FinalProject" 
          } 
         ] 
        } 
       } 
      ] 
     } 
    ], 
    "status": "success", 
    "metrics": { 
     "elapsedTime": "2.82063ms", 
     "executionTime": "2.765439ms", 
     "resultCount": 1, 
     "resultSize": 1917 
    } 
} 
+2

(1) Couchbase 버전, (2) 실행하려는 쿼리 (전체 쿼리 포함) 및 (3) "이들이 나를 위해 작동하지 않음"을 나타내는 질문을 편집하십시오. 무슨 일이 일어나고있는거야?). – geraldss

+0

방금 ​​Couchbase에서 실행했는데 올바르게 실행되었습니다. 나는 당신이 "나를 위해 일하지 않는다"는 것이 그 인덱스를 사용하지 않는 SELECT를 실행하고 있다고 가정합니다. 사용중인 SELECT와 EXPLAIN을 포함하면 도움이 될 것입니다. (아마도 @geraldss가 무엇을 의미합니까?) –

+1

@mgroves 샘플 쿼리를 추가했습니다. –

답변

2

인덱스를 만들려고하는 나의 결과에 따라 인덱싱 할 필드가 포함되지 않은 문서는 제외해야합니다. 그래서 위의 예제를 위해 : name is not missing 안에 where 진술 내 쿼리 내 보조 인덱스를 사용하기 시작했다.

아래 Couchbase site에서 선전

이 찾는

주의를 알려준 : 누락 된 항목은 인덱서에 의해 인덱싱되지 않습니다. 인덱스를 덮어 쓰고 인덱스를 한정하기 위해 쿼리는 인덱스 키 표현식이 MISSING으로 평가되는 문서를 제외시켜야합니다.

1

다음 쿼리가 인덱스를 사용한다.

select s.name, s.credentials 
from `security` s 
where s.credentials is not missing and s.name = 'tom'; 

select s.name, credentials 
from `security` s unnest s.credentials 
where s.credentials is not missing and s.name = 'tom';