En mi situación, empresa (empresa) puede tener varios sitios (filiales), quiero obtener todos los filiales con formato array.

En la empresa json (empresa), no hay información de sitios (filiales), en los sitios json (filiales), tiene uid empresa (empresa). Json entreprise (empresa):

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

Sitios json (filiales):

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

La consulta que probé:

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

Resultado: error

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

Entonces uso alias:

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

Resultado: la matriz de sitios está vacía.

1
Qiang Yu 14 dic. 2016 a las 17:36

2 respuestas

La mejor respuesta

Primero debe crear un índice en los documentos de su sitio:

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

Luego cambie su consulta para usar el nuevo índice:

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"

Esta solución debería satisfacer sus necesidades.

3
Jym 15 dic. 2016 a las 13:52

Debe realizar una unión de índice de sitios a empresas. Consulte https://dzone.com/articles/join-faster-with -couchbase-index-joins

Después de eso, use GROUP BY y ARRAY_AGG () para recopilar los sitios en matrices.

0
geraldss 14 dic. 2016 a las 17:42