Couchbase-更新自引用文档(N1QL)中的子级

问题描述 投票:0回答:1

我在bedbase 6.0.0实例中有一个自引用文档,该文档可以是任意数量的深度。

{
  "branchEndDateTime": "2020-09-22 10:00 am",
  "branchEndX": 0,
  "branchId": "id-652c12fe-000e-4b42-a7e6-e4817d123456",
  "branchName": "Root",
  "branchStartDateTime": "1975-09-22 10:00 am",
  "branchStartX": 0,
  "children": [
    {
      "branchEndDateTime": "1984-09-22 10:00 am",
      "branchEndX": 100,
      "branchId": "id-15c1737f-1ab5-417e-b74c-14f3ee3f3461",
      "branchName": "Test Child Level 1",
      "branchStartDateTime": "1980-09-22 10:00 am",
      "branchStartX": 0,
      "children": [
        {
          "branchEndDateTime": "1984-09-22 10:00 am",
          "branchEndX": 100,
          "branchId": "id-15c1737f-1ab5-417e-b74c-14f3ee3f3467",
          "branchName": "Test Child Level 2",
          "branchStartDateTime": "1980-09-22 10:00 am",
          "branchStartX": 0,
          "children": [
            {
              "branchEndDateTime": "1984-09-22 10:00 am",
              "branchEndX": 100,
              "branchId": "id-15c1737f-1ab5-417e-b74c-14f3ee3fxxxx",
              "branchName": "Test Child Level 3",
              "branchStartDateTime": "1980-09-22 10:00 am",
              "branchStartX": 0,
              "children": [],
              "type": "Branch"
            }
          ],
          "type": "Branch"
        }
      ],
      "type": "Branch"
    }
  ],
  "type": "Branch"
}

每个父对象都有一个子片段,每个片段都有一个ID branchId

"branchId": "id-15c1737f-1ab5-417e-b74c-14f3ee3f3461",

鉴于我知道分支ID,有什么方法可以更新子片段上的单个属性吗?

示例:考虑到我知道branchId为“ id-15c1737f-1ab5-417e-b74c-14f3ee3f3467”,我想将branchName“测试儿童2级”更改为“ Custardy内裤比赛”]

是否有解决此问题的优雅方法?

我已经尝试了以下方法,但是没有解决

UPDATE BucketName AS l
SET o.branchName ='Custardy underpants competition' FOR o IN l.children END
WHERE l.branchId =  "id-15c1737f-1ab5-417e-b74c-14f3ee3f3467"

非常感谢!

参考文献https://www.youtube.com/watch?v=RA68D8hOuSw

couchbase n1ql
1个回答
0
投票

匹配的branchId可以位于文档的根目录或子目录中。更新文档的根目录时,您必须使用d.branchName,即在以下SQL中先设置SET。Second SET会照顾所有孩子,无论其结构有多深(WITHIN)。

如果没有branchId,也永远不会使文档突变,那么您还需要WHERE子句WITHIN。

UPDATE default d
SET d.branchName = CASE WHEN d.branchId = "id-15c1737f-1ab5-417e-b74c-14f3ee3f3467" TEHN "Custardy underpants competition" ELSE d.branchName END,
b.branchName = "Custardy underpants competition" FOR b WITHIN d WHEN b.branchId = "id-15c1737f-1ab5-417e-b74c-14f3ee3f3467" AND b.type = "Branch" END
WHERE ANY b WITHIN d SATISFIES b.type = "Branch" AND b.branchId = "id-15c1737f-1ab5-417e-b74c-14f3ee3f3467" AND b.type = "Branch" END;
© www.soinside.com 2019 - 2024. All rights reserved.