Couchbase - обновить дочерний элемент в документе с собственной ссылкой (N1QL) - PullRequest
1 голос
/ 10 марта 2020

У меня есть экземпляр собственной ссылки в моем экземпляре couchbase 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"
}

У каждого родителя есть дочерний фрагмент, а у каждого фрагмента есть идентификатор branchId

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

Учитывая, что я знаю идентификатор ветви, есть ли способ обновить отдельное свойство для дочернего фрагмента?

пример : я хочу изменить значение branchName "Test Child Level 2" на "Custardy underpants Competition", если я знаю, что branchId равен "id -15c1737f-1ab5-417e-b74 c -14f3ee3f3467 "

Есть ли элегантное решение этой проблемы?

Я пробовал следующее, но не получается

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

1 Ответ

2 голосов
/ 10 марта 2020

Соответствующий BranchId может быть в root документа или в дочерних элементах. Обновите root документа, который вы должны использовать d.branchName, т.е. первый SET в следующем SQL. Второй SET позаботится обо всех дочерних элементах, насколько он глубок независимо от структуры (WITHIN).

Также вам необходимо выражение WHERE WITHIN, если нет BranchId, который никогда не изменяет документ.

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