Поделиться через


Частичное обновление документа в Azure Cosmos DB

ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL

Функция частичного обновления документа Azure Cosmos DB (также известная как API исправлений) предоставляет удобный способ изменения документа в контейнере. В настоящее время для обновления документа клиенту нужно его прочитать, выполнить проверки управления оптимистической блокировкой (при необходимости), обновить документ на локальном уровне, а затем отправить его по сети с помощью вызова API для замены документа целиком.

Функция частичного обновления документов значительно упрощает процесс. Клиент может отправлять только измененные свойства и поля в документе, не выполняя операции полной замены. Основные преимущества этой функции:

  • Повышение производительности разработчиков. Предоставляет удобный API для удобства использования и возможности условного обновления документа.
  • Повышения производительности. Позволяет избежать лишних циклов ЦП на стороне клиента, уменьшает сквозную задержку и используемую пропускную способность сети.
  • Несколько регионов записи. Поддерживает автоматическое и прозрачное разрешение конфликтов при частичном обновлении дискретных путей в одном и том же документе.

Примечание.

Операция частичного обновления документа основана на rfC исправления JSON. Имена свойств в путях должны экранировать ~ и символы соответственно ~0 ~1./

Пример целевого документа JSON:

{
  "id": "e379aea5-63f5-4623-9a9b-4cd9b33b91d5",
  "name": "R-410 Road Bicycle",
  "price": 455.95,
  "inventory": {
    "quantity": 15
  },
  "used": false,
  "categoryId": "road-bikes",
  "tags": ["r-series"]
}

Документ с исправлением JSON:

[
  { "op": "add", "path": "/color", "value": "silver" },
  { "op": "remove", "path": "/used" },
  { "op": "set", "path": "/price", "value": 355.45 }
  { "op": "incr", "path": "/inventory/quantity", "value": 10 },
  { "op": "add", "path": "/tags/-", "value": "featured-bikes" },
  { "op": "move", "from": "/color", "path": "/inventory/color" }
]

Итоговый документ JSON:

{
  "id": "e379aea5-63f5-4623-9a9b-4cd9b33b91d5",
  "name": "R-410 Road Bicycle",
  "price": 355.45,
  "inventory": {
    "quantity": 25,
    "color": "silver"
  },
  "categoryId": "road-bikes",
  "tags": ["r-series", "featured-bikes"]
}

Поддерживаемые операции

В этой таблице перечислены операции, поддерживаемые этой функцией.

Примечание.

Целевой путь — это расположение в документе JSON

Тип операции Description
Прибавить Add выполняет одно из следующих действий в зависимости от целевого пути:
• Если целевой путь указывает элемент, который не существует, он добавлен.
• Если целевой путь указывает элемент, который уже существует, его значение заменяется.
• Если целевой путь является допустимым индексом массива, новый элемент вставляется в массив по указанному индексу. Это перемещает существующие элементы после нового элемента.
• Если указанный индекс равен длине массива, он добавляет элемент в массив. Вместо того, чтобы указывать индекс, также можно использовать символ -. Он также приводит к добавлению элемента в массив.
Примечание. Указание индекса, превышающего длину массива, приводит к ошибке.
Задание записи Set операция аналогична Add операции, за исключением типа данных массива. Если целевой путь является допустимым индексом массива, то существующий элемент в этом индексе обновляется.
Replace Операция Replace похожа на Set, кроме того, что она следует строгой семантике замены. Если целевой путь указывает элемент или массив, который не существует, он приводит к ошибке.
Удалить Remove выполняет одно из следующих действий в зависимости от целевого пути:
• Если целевой путь указывает элемент, который не существует, он приводит к ошибке.
• Если целевой путь указывает элемент, который уже существует, он удаляется.
• Если целевой путь является индексом массива, он удаляется и все элементы над указанным индексом сдвигаются обратно в одну позицию.
Примечание. Если указать индекс равный или больше длины массива, это приведет к ошибке.
Приращение Этот оператор увеличивает поле на указанное значение. Он может принимать как положительные, так и отрицательные значения. Если поле не существует, оно создает поле и задает его указанному значению.
Передвинуть Этот оператор удаляет значение в указанном расположении и добавляет его в целевое расположение. Объект операции должен содержать элемент from, который является строкой, содержащей значение указателя JSON, которое ссылается на расположение в целевом документе, чтобы переместить значение из него. Расположение from должно существовать для успешной операции. Если расположение path предлагает объект, который не существует, он создаст объект и присвоит значение, равное значению из расположения
•Если расположение path предлагает объект, который уже существует, он заменит значение в расположении path значением в расположении "from"
Атрибут •"Path" не может быть дочерним элементом JSON расположения "from" JSON

Поддерживаемые режимы

Функция частичного обновления документа поддерживает перечисленные ниже режимы работы. Примеры кода можно найти в документе Начало работы.

  • Исправление одного документа. вы можете внести исправление в отдельный документ с учетом его идентификатора и ключа раздела. Можно выполнить несколько операций исправления в одном документе. Максимальное ограничение — 10 операций.

  • Исправление нескольких документов. Несколько документов в одном ключей раздела можно исправить в качестве части транзакции. Эта транзакция с несколькими документами фиксируется только в том порядке, в котором они описаны. Но при сбое любой отдельной операции выполняется откат всей транзакции.

  • Условное обновление: для указанных выше режимов также можно добавить предикат фильтра, подобный SQL (например, ), так что операция завершается ошибкой, from c where c.taskNum = 3если предварительные условия, указанные в предикате, не удовлетворены.

  • Вы также можете использовать массовые API поддерживаемых SDK для выполнения одной или нескольких операций исправления для нескольких документов.

Сходства и различия

Давайте сравним сходства и различия между поддерживаемыми режимами.

Add и Set

Операция Set аналогична операции Add для всех типов данных, кроме Array. Операция Add с любым (допустимым) индексом приводит к добавлению элемента по указанному индексу и все существующие элементы массива в конечном итоге сдвигаются после существующего элемента. Это поведение отличается от Set операции, которая обновляет существующий элемент по указанному индексу.

Add и Replace

Операция Add добавляет свойство, если оно еще не существует (включая тип данных Array). Replace операция завершается ошибкой, если свойство не существует (применяется Array к типу данных, а также).

Set и Replace

Операция Set добавляет свойство, если оно еще не существует (за исключением Array). Replace операция завершается ошибкой, если свойство не существует (применяется Array к типу данных, а также).

Примечание.

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

Справка по API REST для частичного обновления документа

REST API Azure Cosmos DB обеспечивает программный доступ к ресурсам Azure Cosmos DB для создания, запроса и удаления баз данных, коллекций документов и документов. В дополнение к выполнению операций вставки, замены, удаления, чтения, нумерации и запроса в документах JSON в коллекции можно использовать метод HTTP PATCH для частичного обновления документа. Дополнительные сведения см. в справке по REST API Azure Cosmos DB.

Например, вот как выглядит запрос для операции с использованием частичного set обновления документа.

PATCH https://querydemo.documents.azure.com/dbs/FamilyDatabase/colls/FamilyContainer/docs/Andersen.1 HTTP/1.1
x-ms-documentdb-partitionkey: ["Andersen"]
x-ms-date: Tue, 29 Mar 2016 02:28:29 GMT
Authorization: type%3dmaster%26ver%3d1.0%26sig%3d92WMAkQv0Zu35zpKZD%2bcGSH%2b2SXd8HGxHIvJgxhO6%2fs%3d
Content-Type:application/json_patch+json
Cache-Control: no-cache
User-Agent: Microsoft.Azure.DocumentDB/2.16.12
x-ms-version: 2015-12-16
Accept: application/json
Host: querydemo.documents.azure.com
Cookie: x-ms-session-token#0=602; x-ms-session-token=602
Content-Length: calculated when request is sent
Connection: keep-alive
{
  "operations": [
    {
      "op": "set",
      "path": "/Parents/0/FamilyName",
      "value": "Bob"
    }
  ]
}

Разрешение конфликтов на уровне документа и на уровне пути

Если в вашей учетной записи Azure Cosmos DB настроено несколько областей записи, на уровне документа применяются политики конфликтов и разрешения конфликтов, и политикой по умолчанию для разрешения конфликтов является приоритет последней записи (LWW). При частичном обновлении документа операции исправления в нескольких регионах выявляют и устраняют конфликты на более детальном уровне пути.

Разрешение конфликтов можно лучше понять с помощью примера.

Предположим, что в Azure Cosmos DB имеется следующий документ:

{
  "id": 1,
  "name": "John Doe",
  "email": "jdoe@contoso.com",
  "phone": ["12345", "67890"],
  "level": "gold"
}

Разные клиенты выполняют операции исправления одновременно в разных регионах:

  • Задать (Set) для атрибута /level значение "platinum"
  • Удалить (Remove) 67890 из атрибута /phone

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

Так как запросы на исправление были сделаны к неконфликционным путям в документе, эти запросы разрешаются автоматически и прозрачно (в отличие от last Writer Wins на уровне документа).

После разрешения конфликтов клиент увидит следующий документ:

{
  "id": 1,
  "name": "John Doe",
  "email": "jdoe@contoso.com",
  "phone": ["12345"],
  "level": "platinum"
}

Примечание.

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

Канал изменений

Канал изменений в Azure Cosmos DB прослушивает контейнер на предмет любых изменений, а затем выводит документы, которые были изменены. С помощью канала изменений можно просмотреть все обновления документов, включая частичные и полные. При обработке элементов из канала изменений возвращается полный документ, даже если обновление было результатом операции исправления.

Дополнительные сведения о канале изменений в Azure Cosmos DB см. в разделе Канал изменений в Azure Cosmos DB.

Следующие шаги