Couchbase N1QL-запрос с объединенным подзапросом с помощью USE KEYS - PullRequest
0 голосов
/ 08 января 2020

Мне нужно написать запрос n1ql, который требует другого подзапроса в предложении select. Поскольку при написании подзапросов в n1ql обязательно использовать «USE KEYS». Как написать предложение USE KEYS для внутреннего присоединенного запроса, ниже приведен пример того же случая:

select meta(m).id as _ID, meta(m).cas as _CAS, 
   (select c.description 
    from bucketName p join bucketName c on p.categoryId = c.categoryId and p.type='product' and 
    c.type='category' and p.masterId=m.masterId ) as description //--How to use USE KEYS here ?
from bucketName m where m.type='master' and m.caseId='12345'  

Мое требование - извлечь какое-либо значение из двух других объединенных таблиц. тем не менее, я упростил приведенный выше запрос, чтобы сделать его более понятным.

  • Пожалуйста, предложите правильный способ реализации.
  • Кроме того, лучше ли писать подзапросы в n1ql, чем отдельно выбирать документы и объединять их в коде?

1 Ответ

2 голосов
/ 08 января 2020

Без ОТНОШЕНИЯ, коррелированные подзапросы требуют ИСПОЛЬЗОВАНИЯ КЛЮЧЕЙ, поскольку глобальные вторичные индексы могут занимать много времени и ресурсов. Это ограничение в настоящее время в N1QL. Если вы можете извлечь ключ документа p из m, вы можете указать его как USE KEYS в p.

В противном случае у вас есть две опции

Опция 1: поскольку ваш подзапрос находится в проекции Используйте ANSI JOIN https://blog.couchbase.com/ansi-join-support-n1ql/

SELECT META(m).id AS _ID, META(m).cas AS _CAS, c.description
FROM bucketName AS m
LEFT JOIN bucketName AS p ON p.masterId=m.masterId AND p.type='product'
LEFT JOIN bucketName AS c ON c.type='category' AND p.categoryId = c.categoryId
WHERE m.type='master' AND m.caseId='12345';

CREATE INDEX ix1 ON (caseId) WHERE type='master';
CREATE INDEX ix2 ON (masterId, categoryId) WHERE type='product';
CREATE INDEX ix3 ON (categoryId, description) WHERE type='category';

NOTE: If there is no Unique relation m to p to c JOIN can produce more results. 
If that is case, you can do GROUP BY META(m).id, META(m).cas and 
ARRAY_AGG(c.description). All descriptions are given as ARRAY.

Вариант 2: Как описано, вы выпускаете два отдельных запроса и объединяетесь в приложении.

...