Couchbase 如何使用n1ql将变量传递到子查询中?

Couchbase 如何使用n1ql将变量传递到子查询中?,couchbase,n1ql,Couchbase,N1ql,在我的情况下,企业(公司)可以有几个站点(子公司),我想用格式数组获得所有子公司 在json企业(公司)中,没有站点(子公司)的信息,在json站点(子公司)中,它有企业(公司)uid。 Json企业(公司): Json站点(子公司): 我尝试的查询: SELECT META(entreprise).id as uid, ARRAY s FOR s IN (SELECT d.* FROM default d WHERE d.type = "sit

在我的情况下,企业(公司)可以有几个站点(子公司),我想用格式数组获得所有子公司

在json企业(公司)中,没有站点(子公司)的信息,在json站点(子公司)中,它有企业(公司)uid。 Json企业(公司):

Json站点(子公司):

我尝试的查询:

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

结果:站点数组为空。

您需要执行从站点到企业的索引联接。看


然后,使用GROUP BY和ARRAY_AGG()将站点收集到数组中。

首先,您必须在站点文档上创建索引:

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"
此解决方案应满足您的需要

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"