#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