如何删除分区中的所有数据?



我有一个CosmosDB集合,其中包含许多不同的分区。 我想删除其中一个分区中的所有数据,所以我尝试运行以下命令:

db.myCollection.deleteAll({PartitionKey: 'pop-9q'})

其中PartitionKey是我分区/分片所基于的字段。 但是当我执行此操作时,它会返回不太有用的消息:

错误

:发生错误

为什么我会收到此消息,如何获取有关原因的更多详细信息或找到解决方案?

目前,您无法执行批量删除。请对此功能进行投票和评论:添加删除分区中所有数据的功能

此外,您正在使用哪个 API?对于 Gremlin API,您可以执行如下操作:g.V((.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所说,Cosmos db SQL API和Mongo API尚不支持"删除所有数据"功能。我注意到您已经在上面的链接中添加了评论。我只是在这里为您提供一种解决方法,即对 Cosmos db SQL API 使用批量删除存储过程。

(示例代码:https://gist.github.com/deepumi/2a23c5380202bddf0b85e83baf5833be(

不幸的是,对于Mongo API,甚至不支持存储过程。可以创建 Azure HTTP 触发器函数,以便随时在函数中执行批量删除代码,或将其合并到程序代码中。

对于 GremlinAPI,您可以执行以下操作:

  1. 确保在顶点和边上具有直接partitionKey属性。 如果没有,则只需将该属性添加到所有顶点和边即可。
  2. 每次插入顶点或边时,请正确设置属性,同时设置 CosmosDB 容器的分区键。

要从上述分区中删除所有数据,只需执行以下操作:

g.V().has('partitionKey', 'yourPartitionKey').drop()

这将确保仅删除具有partitionKey属性的yourPartitionKey值的顶点。

由于 Gremlin 确保在删除顶点时没有悬空边缘,因此所有边也将自动删除。

最新更新