N1QL Изменить объект внутри массива - PullRequest
1 голос
/ 19 марта 2019

У меня есть документы внутри корзины Couchbase, которые содержат массив объектов.Я пытаюсь одновременно редактировать два разных объекта, содержащихся в массиве одного и того же документа.

В настоящее время я выполняю следующий запрос для редактирования одного из этих объектов:

UPDATE mydoc SET x.myfield = $1 FOR x IN mydoc.myarray WHEN x.`key` = $2 END;

Isесть ли способ одновременно выполнить несколько запросов, таких как этот, когда я редактирую два отдельных вложенных документа?

Я взглянул на API subdoc, который, по-видимому, не предоставляет такую ​​возможность, но если есть способ,Я стремлюсь использовать его вместо необработанного N1QL-запроса.

Является ли мой единственный вариант заблокировать весь документ, а затем разблокировать его после завершения обновления?Я использую клиент GoCB, если это поможет.

Спасибо!

1 Ответ

0 голосов
/ 19 марта 2019

Предложение WHERE определяет, какой документ в выражении UPDATE, а предложение SET - что обновлять.Вам нужно предложение WHERE, чтобы избежать ненужных мутаций.

UPDATE mydoc SET x.myfield = $1 FOR x IN mydoc.myarray WHEN x.`key` = $2 END
WHERE ANY v IN mydoc.myarray SATISFIRS v.`key` = $2 AND v.myfield != $1 END;

Выше оператор обновляет все совпадающие поля в массиве.Зачем вам нужно обновлять несколько утверждений одновременно.Здесь нет ограничений.Но примечание для обновления документа необходимо получить, изменить и записать обратно.В промежутке между некоторыми другими изменениями потока CAS будет не соответствовать, и ошибка будет возвращаться, и вам нужно обработать этот случай.

...