Вставка или слияние CosmosDB SQL API

#azure-cosmosdb #upsert

Вопрос:

В некоторых случаях мы решили перейти с хранилища таблиц Azure (ATS) на CosmosDB. Я пытаюсь понять, как имитировать InsertOrMerge работу ATS в CosmosDB SQL API. Использование UpsertItemAsync фактически заменяет элемент (если он найден).

Чтобы проиллюстрировать проблему, давайте представим, что app1 создает элемент из 3 ненулевых полей в CosmosDB. app2 хочет обновить элемент, но имеет элемент из 2 ненулевых полей (например, одно из них является идентификатором, соответствующим предыдущей записи). InsertOrMerge из ATS это приведет к появлению 2 новых полей not null, а оставшееся поле будет из поля элемента app1 (not null). UpsertItemAsync from Cosmos просто заменит элемент (потеряв третье поле).

Конечно, это можно было бы сделать, сначала получив элемент, объединив его с новым объектом и заменив новым элементом, но это означает еще один вызов. Есть ли способ сделать это без предварительного извлечения элемента?

Ответ №1:

Однако Partial Document Update в Cosmos DB есть функциональность, которая в настоящее время находится в режиме закрытого предварительного просмотра (на момент ответа на этот вопрос).

Вы можете узнать больше об этой функции и о том, как включить эту функцию в своей учетной записи, пожалуйста, посмотрите эту ссылку: https://github.com/AzureCosmosDB/PatchPrivatePreviewFeedbackGroup .

Комментарии:

1. Спасибо за ответ. Это именно то, что я искал. Есть ли у вас какие-либо идеи, когда это станет частью стабильного пакета (а не в режиме предварительного просмотра)? Или есть ли вероятность, что эта функциональность вообще не будет выпущена (надеюсь, нет)? Не уверен, можем ли мы полагаться на это в производственных приложениях..

2. Я бы позволил кому-нибудь из Cosmos DB ответить на этот вопрос.

3. На это действительно никто не может ответить, даже кто-то из команды Cosmos DB — это вопрос дорожной карты / планирования.

Ответ №2:

Я добавляю это как еще один ответ, указывающий метод и образец.

Как @Gaurav уже упоминалось, именно здесь вы можете использовать функцию API частичного обновления документа с Cosmosdb. То, что вы ищете, — это метод Replace

 cosmosPatchOperations.replace("/taskNum", newTaskNum);
 

Также вы можете использовать условную команду операции исправления для замены свойства.

Комментарии:

1. Здравствуйте. Я вижу, что вы также ответили на мой вопрос в MS Q amp; A. Возможно, последующий вопрос, я зарегистрировался через форму по указанной вами ссылке, однако я еще не получил подтверждения. Может быть, это причина, по которой я получаю 400-неверный запрос (без какой-либо причины) при попытке выполнить операции исправления?

2. Да, правильно, можете ли вы указать свой идентификатор подписки, чтобы проверить внутренне, была ли она активирована. Также вы можете протестировать API исправлений с помощью эмулятора, запустив /EnablePatchPreview