Как обновить части документа в Couchbase

79
12

При сканировании документов я не могу найти, как обновить часть документа.

например, весь документ выглядит следующим образом: {"Активный": true, "Barcode": "123456789", "BrandID": "9f3751ef-f14f-464a-bb86-854e99cf14c0", "BuyCurrencyOverride": ".37", "BuyDiscountAmount": "45,00", "ID": "003565a3-4a0d-47d9-befb-0ac642cb8057",}

но я хочу работать только с частью документа, поскольку во многих случаях я не хочу выбирать/обновлять весь документ:

{"Active": false, "Barcode": "999999999", "BrandID": "9f3751ef-f14f-464a-bb86-854e99cf14c0", "ID": "003565a3-4a0d-47d9-befb-0ac642cb8057",}

Как я могу использовать N1QL для обновления этих полей? Upsert полностью заменяет весь документ, и инструкция обновления не так понятна.

благодаря

спросил(а) 2021-01-19T16:18:35+03:00 6 месяцев, 1 неделя назад
1
Решение
110

Ответ на ваш вопрос зависит от того, почему вы хотите обновить только часть документа (например, вас беспокоит пропускная способность сети?) И как вы хотите выполнить обновление (например, из веб-консоли? Из программы, используя SDK?).

API-интерфейс субдокумента 4.5, для которого вы предоставили ссылку в своем комментарии, является функцией, доступной только через SDK (например, с программ Go или Java), и цель этой функции заключается в уменьшении пропускной способности сети без передачи всей документы вокруг. Использует ли ваш вариант использования программные модификации документа через SDK? Если это так, то API-интерфейс суб-документа - хороший способ.

Использование инструкции " UPDATE " в N1QL - хороший способ изменить любое количество документов, которые соответствуют шаблону, для которого вы можете указать предложение WHERE. Как отмечено выше, он работает очень аналогично оператору UPDATE в SQL. Чтобы использовать ваш пример выше, вы можете изменить поле "Актив" на "ложь" в любых документах, где BuyDiscountAmount "45.00":

UPDATE my bucket SET Active = false WHERE BuyDiscountAmount = "45.00"

При запуске запросов N1QL UPDATE почти весь сетевой трафик будет находиться между узлами Query, Index и Data вашего кластера, поэтому обновление N1QL не приводит к большому сетевому трафику в/из вашего кластера.

Если вы предоставите более подробную информацию о своем прецеденте и почему хотите обновить только часть своих документов, я мог бы предоставить более конкретные рекомендации по правильному подходу.

ответил(а) 2021-01-19T16:18:35+03:00 6 месяцев, 1 неделя назад
78

API-интерфейс sub-doc, введенный в Couchbase4.5, в настоящее время не используется N1QL. Однако, когда вы используете инструкцию UPDATE для обновления частей одного или нескольких документов.

http://developer.couchbase.com/documentation/server/current/n1ql/n1ql-language-reference/update.html


Дайте мне знать любые вопросы. -Prasad

ответил(а) 2021-01-19T16:18:35+03:00 6 месяцев, 1 неделя назад
45

Это просто, как sql-запрос.

update 'Employee' set District='SambalPur' where EmpId="1003"

и вот ответ

{

    "Employee": {
"Country": "India",
"District": "SambalPur",
"EmpId": "1003",
"EmpName": "shyam",
"Location": "New-Delhi"
}
}

ответил(а) 2021-01-19T16:18:35+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема