Как передать переменную в подзапрос с помощью n1ql?

В моей ситуации предприятие (компания) может иметь несколько сайтов (филиалов), я хочу получить все филиалы с массивом форматов.

В json entreprise (компании) нет информации о сайтах (filiales), на json сайтах (filiales) есть entreprise (company) uid. Json entreprise (компания):

{
  "type": "entreprise",
  "dateUpdate": 1481716305279,
  "owner": {
    "type": "user",
    "uid": "PNnqarPqSdaxmEJ4DoMv-A"
  }
}

Сайты Json (filiales):

  {
  "type": "site",
  "entreprise": {
    "uid": "3c0CstzsTjqPdycL5yYzJQ",
    "type": "entreprise"
  },
  "nom": "test"
}

Запрос, который я пробовал:

  SELECT 
          META(entreprise).id as uid, 
          ARRAY s FOR s IN (SELECT d.* FROM default d  WHERE d.type = "site" AND  d.entreprise.uid = uid) END as sites, 
          entreprise.* 
        FROM default entreprise 
        WHERE entreprise.type = "entreprise";

Результат: ошибка

 {
    "code": 5010,
    "msg": "Error evaluating projection. - cause: FROM in correlated subquery must have USE KEYS clause: FROM default."
  }

Затем я использую псевдоним:

SELECT 
  META(entreprise).id as uid, 
  ARRAY s FOR s IN (SELECT d.* FROM default d  WHERE d.type = "site" AND  d.entreprise.uid = META(entreprise).id) END as sites, 
  entreprise.* 
FROM default entreprise 
WHERE entreprise.type = "entreprise";

Результат: массив сайтов пуст.


person Qiang Yu    schedule 14.12.2016    source источник


Ответы (2)


Сначала вам нужно создать индекс документов вашего сайта:

CREATE INDEX site_ent_idx ON default(entreprise.uid) WHERE type="site";

Затем измените свой запрос, чтобы использовать новый индекс:

SELECT 
META(entreprise).id as uid, 
ARRAY s FOR s IN (
    SELECT site.* 
    FROM default as ent USE KEYS META(entreprise).id 
    JOIN default as site ON KEY site.entreprise.uid FOR ent
) END as sites, 
entreprise.* 
FROM default entreprise 
WHERE entreprise.type = "entreprise"

Это решение должно соответствовать вашим потребностям.

person Jym    schedule 14.12.2016

Вам необходимо выполнить индексное соединение сайтов с предприятиями. См. https://dzone.com/articles/join-faster-with-couchbase-index-joins

После этого используйте GROUP BY и ARRAY_AGG (), чтобы собрать сайты в массивы.

person geraldss    schedule 14.12.2016