Couchbase双嵌套数组中每个项目的子查询

问题描述

具有下一个对象

"a" : {
  "id" : "1","arr" : [
    {"id" : "b1"},{"id" : "b2"}
  ]
}

"b1" : {
  "id" : "b1","innerArr" : [{"id" : "c1"},{"id" : "c2"}]
}

"b2" : {
  "id" : "b2","innerArr" : [{"id" : "c3"}]
}

"c1" : {
  "name" : "c1"
}...

现在,我可以通过这样的数组与nesT联接。

SELECT *
FROM bucket AS a
nesT bucket AS bs
  ON Meta(a).id IN a.arr[*].id


{
  "id" : "1",{"id" : "b2"}
  ],"bs" : [
    {
      "id" : "b1",{"id" : "c2"}]
    },{
      "id" : "b2","innerArr" : [{"id" : "c3"}]
    }
  ]
}

现在我要为c中的每个项目嵌套bs个文档

添加nesT不起作用

nesT bucket AS c
  ON Meta(c).id IN bs[*].innerArr[*].id

我正在寻找这个结果:

{
  "id" : "1",{"id" : "c2"}],"cs" : [{"name" : "c1"},{"name" : "c2"}]
    },"innerArr" : [{"id" : "c3"}],"cs" : [{"name" : "c3"}]
    }
  ]
}

解决方法

我能够解决迭代subquerybs中每个元素的问题。由于子查询位于查询的SELECT部分​​中,因此它必须具有USE KEYS而不是ON META()。id =。最后,我将子查询结果添加到每个项目中。

SELECT a*.,ARRAY OBJECT_ADD(item,"cs",(SELECT c.* FROM bucket AS c USE KEYS item.innerArr[*].id)) FOR item IN bs END 
FROM bucket AS a,NEST bucket AS bs
  ON META(a).id IN a.arr[*].id

这意味着对于bs中的每个元素,它查询innerArray的每个元素。然后将结果添加到bs的元素中。

,

NEST桶AS bs。

bs以文档(扫描,获取,打开)开头。在NEST的末尾,bs成为“过滤器”,“组”,“投影”等的阵列。同样适用于链接的JOIN,NEST。示例17:https://blog.couchbase.com/ansi-join-support-n1ql/

在这种情况下,请在LEFT文档上使用JOIN + GROUP +在正确文档上使用ARRAG_AGG。或使用ARRAY…FOR…语法。

可以通过以下查询获得所需的结果。这个左外巢

SELECT a.*,(SELECT b.*,(SELECT c.*
                 FROM  bucket AS c USE KEYS b.innerArr[*].id) AS cs
        FROM bucket AS b USE KEYS a.arr[*].id) AS bs
FROM bucket AS a
WHERE ..........;