Мы используем 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 (вставка, обновление, удаление), которые будут выполняться в рамках транзакции, но невозможно закрепить запрос в транзакции. Единственное, что обеспечивает некоторое количество условного выполнения, — это частичное обновление документа, но вы не можете использовать его для удаления документа.