Как удалить все данные в разделе?
У меня есть коллекция CosmosDB с несколькими различными разделами. Я хочу удалить все данные в одном из разделов, поэтому я попытался выполнить команду:
db.myCollection.deleteAll({PartitionKey: 'pop-9q'})
куда PartitionKey
это поле, на котором я делю / шарду на основе. Но когда я выполняю это, он возвращает не очень полезное сообщение:
ОШИБКА: произошла ошибка
Почему я получаю это сообщение и как я могу получить более подробную информацию о причине или найти решение?
4 ответа
В настоящее время вы не можете выполнить массовое удаление. Пожалуйста, проголосуйте и прокомментируйте эту функцию: добавьте возможность удалять ВСЕ данные в разделе
Кроме того, какой API вы используете? Для Gremlin API вы можете выполнить что-то вроде следующего: gV(). Drop()
Эта возможность добавлена в Microsoft.Azure.Cosmos SDK. В настоящее время она доступна только в качестве функции предварительного просмотра (для этого требуется подписка на портале). Дополнительные сведения см. здесь:https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/how-to-delete-by-partition-key?tabs=dotnet-example
Пример кода, включенный туда:
// Get reference to the container
var container = cosmosClient.GetContainer("DatabaseName", "ContainerName");
// Delete by logical partition key
ResponseMessage deleteResponse = await container.DeleteAllItemsByPartitionKeyStreamAsync(new PartitionKey("Contoso"));
if (deleteResponse.IsSuccessStatusCode) {
Console.WriteLine($"Delete all documents with partition key operation has successfully started");
}
Как сказал @Mike, delete all data
функция пока не поддерживается в Cosmos db, sql api и mongo api. Я заметил, что вы уже добавили комментарии в приведенной выше ссылке. Я просто предлагаю вам обходной путь, который использует хранимую процедуру массового удаления для cosmos db sql api.
(пример кода: https://gist.github.com/deepumi/2a23c5380202bddf0b85e83baf5833be)
Для mongo api, к сожалению, даже хранимая процедура не поддерживается. Вы можете создать функцию запуска HTTP Azure для выполнения кода массового удаления в функции в любое время или объединить его с программным кодом.
Надеюсь, это поможет вам.
Для GremlinAPI вы можете сделать следующее:
- Убедитесь, что у вас есть свойство непосредственно на вершине, а также на ребре. если у вас его нет, то просто добавьте свойство ко всем вершинам и ребрам.
- задайте свойство правильно каждый раз, когда вы вставляете вершину или ребро вместе с установкой ключа раздела для вашего контейнера CosmosDB.
чтобы удалить все данные из вышеуказанного раздела, просто сделайте следующее:
g.V().has('partitionKey', 'yourPartitionKey').drop()
это гарантирует, что только те вершины, которые имеютyourPartitionKey
ценность дляpartitionKey
свойство будет удалено.
Поскольку Gremlin гарантирует отсутствие висячих ребер при удалении вершины, все ребра также будут автоматически удалены.