Couchbase N1QL Query выделяется на основе определенных полей - PullRequest
2 голосов
/ 18 июня 2020

У меня есть структура документа, которая выглядит примерно так:

{
...
     "groupedFieldKey": "groupedFieldVal",
     "otherFieldKey": "otherFieldVal",
     "filterFieldKey": "filterFieldVal"
...
}

Я пытаюсь получить все документы, уникальные по отношению к groupedFieldKey. Я также хочу получить otherField из ЛЮБОГО этих документов. Этот otherFieldKey имеет незначительные изменения от одного документа к другому, но мне удобно получать ЛЮБЫЕ из этих значений.

SELECT DISTINCT groupedFieldKey, otherField
FROM bucket
WHERE filterFieldKey = "filterFieldVal";

Этот запрос извлекает все документы из-за незначительных изменений .

SELECT groupedFieldKey, maxOtherFieldKey 
FROM bucket
WHERE filterFieldKey = "filterFieldVal"
GROUP BY groupFieldKey
LETTING maxOtherFieldKey= MAX(otherFieldKey);

Этот запрос работает должным образом, но занимает много времени из-за шага GROUP BY. Поскольку этот запрос используется для отображения продуктов в пользовательском интерфейсе, это нежелательное поведение. Я пробовал применять индексы, но это не дало быстрых результатов.

Фактическая информация о записях:

  • Количество записей = 100000
  • Размер на запись = Приблизительно 10 КБ
  • Время, затраченное на загрузку первых 10 записей:

Есть ли лучший способ сделать это? Подойдет способ получения DISTINCT только для определенных полей.


EDIT 1 : вы можете следить за этой веткой обсуждения на форуме Couchbase: https://forums.couchbase.com/t/getting-distinct-on-the-basis-of-a-field-with-other-fields/26458

1 Ответ

1 голос
/ 18 июня 2020

ГРУППА должна оформить все документы. Вы можете попробовать покрыть индекс

CREATE INDEX ix1 ON bucket (filterFieldKey, groupFieldKey, otherFieldKey);

...