我有一个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,您可以执行以下操作:
- 确保在顶点和边上具有直接
partitionKey
属性。 如果没有,则只需将该属性添加到所有顶点和边即可。 - 每次插入顶点或边时,请正确设置属性,同时设置 CosmosDB 容器的分区键。
要从上述分区中删除所有数据,只需执行以下操作:
g.V().has('partitionKey', 'yourPartitionKey').drop()
这将确保仅删除具有partitionKey
属性的yourPartitionKey
值的顶点。
由于 Gremlin 确保在删除顶点时没有悬空边缘,因此所有边也将自动删除。