如何解决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"}]
}
]
}
解决方法
我能够解决迭代subquery中bs
中每个元素的问题。由于子查询位于查询的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 ..........;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。