2016-12-14 3 views
0

В моей ситуации, entreprise (компания) может иметь несколько сайтов (filiales), я хочу получить все filiales с массивом формата.Как передать переменную в подзапрос с помощью n1ql?

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

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

JSon сайтов (filiāles):

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

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

ответ

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" 

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

+0

Merci, он работает. :) –

0

Вам необходимо выполнить объединение индексов с сайтов на предприятия. См.

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

Смежные вопросы