2016-06-23 1 views
1

В CouchBase (4.1.1) N1QL может индексировать get, созданный с использованием всего элемента, взять эти два примера.CockBase Index вложенные элементы

сказать, что мы этот документ структура:

{ 
    "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; 

при запуске объяснить мои вторичные индексы не используются и couchbase по умолчанию первичного индекса для этого ведра.

вот выбор, который я использую.

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'; 
Смежные вопросы