Azure CosmosDb CreateTransactionalBatch с FeedIterator или условным оператором

Мы используем Microsoft.Azure.Cosmos Version="3.23.0" в проекте .net Core. Я использую библиотеку транзакций для операций. Я хочу создать транзакцию, в которой элемент должен быть удален, если количество документов, использующих определенное свойство, равно 0. Все документы находятся в одном контейнере и используют один и тот же ключ раздела. например Имеются документы для лиц с имуществом

Id: 
PartitionKey: ffff
Name:
LastName: 
Occupation:

Есть второй документ на занятие:

Id:
ParitionKey: ffff
Occupation:
Salary:

Я хочу удалить документ о профессии, если нет документов о людях, использующих эту профессию. Я могу написать запрос, чтобы получить количество документов, где Occupation имеет определенное значение, а затем хочу удалить, если количество равно 0. Интересно, могу ли я сделать все это, используя библиотеку транзакций.

Я бы написал запрос, чтобы получить счет примерно так:

QueryDefinition queryDefinition =
            new QueryDefinition("SELECT value count(1) FROM c WHERE (c.occupationId= @occupationId)")
                 .WithParameter("@occupationId", occupationId.ToString()));

                    using (FeedIterator<long> feedIterator = container.GetItemQueryIterator<long>(
                        queryDefinition: queryDefinition,
                        requestOptions: new QueryRequestOptions()
                        {
                            PartitionKey = partitionKey
                        }))
                    {
                        while (feedIterator.HasMoreResults)
                        {
                            FeedResponse<long> response = await feedIterator.ReadNextAsync(cancellationToken);
                            
                            long tempCount = response.Sum();
                            docuCount+= tempCount;
                        }
                    }

Вы можете включить несколько операций с помощью Transactional Batch в Cosmos DB SDK (вставка, обновление, удаление), которые будут выполняться в рамках транзакции, но невозможно закрепить запрос в транзакции. Единственное, что обеспечивает некоторое количество условного выполнения, — это частичное обновление документа, но вы не можете использовать его для удаления документа.

Mark Brown 31.03.2022 22:47
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Управление транзакциями JDBC - это мощная функция, которая позволяет рассматривать группу операций с базой данных как единую единицу работы. Оно...
0
1
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Транзакционный пакет может содержать только точечные операции (чтение, создание, замена, удаление, исправление), без запросов.

И не может содержать условий (например, одна из операций зависит от результата предыдущей).

Другие вопросы по теме

Как запросить SQL вложенный список и массив в MS Azure CosmosDB?
Как включить параметр ключа большого раздела в существующем контейнере в Azure Cosmos db
Когда я создаю контейнеры в Cosmos DB с помощью Pulumi, я получаю эту ошибку «resource.partitionKey.paths» должен иметь тип «массив», но получил строку»
Ошибка функций Azure: строка подключения для отслеживаемой коллекции имеет недопустимый формат
Где найти список настраиваемых возможностей учетной записи Azure Cosmos DB?
Строки Cosmos DB REPLACE во вложенном объекте
Не удается подключиться из функции Azure к Azure Cosmos DB. Получение «Microsoft.Azure.Cosmos.Direct: ссылка на объект не указывает на экземпляр объекта
Можем ли мы создать учетную запись API Azure CosmosDB Core(SQL) в любых регионах с геоизбыточностью, записью в несколько регионов и бессерверной емкостью?
CosmosDB System.ArgumentNullException: «Значение не может быть нулевым. (Параметр 'authKeyOrResourceToken')'
Cosmo Db, как проверить, что коллекция пуста