首页 > 解决方案 > 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",
  "arr" : [
    {"id" : "b1"}, {"id" : "b2"}
  ],
  "bs" : [
    {
      "id" : "b1",
      "innerArr" : [{"id" : "c1"},{"id" : "c2"}]
    },
    {
      "id" : "b2",
      "innerArr" : [{"id" : "c3"}]
    }
  ]
}

现在我想c为每个项目嵌套文档bs

添加此 NEST 不起作用

NEST bucket AS c
  ON META(c).id IN bs[*].innerArr[*].id

我正在寻找这个结果:

{
  "id" : "1",
  "arr" : [
    {"id" : "b1"}, {"id" : "b2"}
  ],
  "bs" : [
    {
      "id" : "b1",
      "innerArr" : [{"id" : "c1"},{"id" : "c2"}],
      "cs" : [{"name" : "c1"},{"name" : "c2"}]
    },
    {
      "id" : "b2",
      "innerArr" : [{"id" : "c3"}],
      "cs" : [{"name" : "c3"}]
    }
  ]
}

标签: couchbasen1ql

解决方案


我能够从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


推荐阅读