如果转到 https://portal.azure.com,打开我们的 Azure Cosmos DB 帐户 (1) --> 数据资源管理器 (2) --> 单击用户 (3) --> 单击新建 SQL 查询:
Azure 将打开一个文本框以输入查询:
我发现Cosmos DB不允许使用DELETE而不是SELECT:https://stackoverflow.com/a/48339202/1198404,所以我应该这样做:
SELECT * FROM c DELETE c
SELECT * FROM c DELETE *
但是我的尝试都没有成功。
一个选项是在该特定容器上将 TTL 设置为 0,具体取决于记录数量,尽管这可能需要一些时间。
或者,这可能是一个更可行的选择,就是简单地删除并重新创建容器。
Cosmos DB 数据库可以包含零个、一个或多个容器。容器存储物品。 here 描述了层次结构。我假设您想要清除所有项目的容器。
由于您的连接字符串的范围仅限于数据库级别,因此我快速清除容器中所有项目的方法是删除并在数据库中重新创建容器。
要在 Azure 门户中删除容器,请执行以下操作:
例如,如果容器名称是 users:
您可以添加删除存储过程来完全执行删除。
function bulkDeleteSproc(query) {
var collection = getContext().getCollection();
var collectionLink = collection.getSelfLink();
var response = getContext().getResponse();
var responseBody = {
deleted: 0,
continuation: true
};
query='SELECT * FROM root r';
// Validate input.
if (!query) throw new Error("The query is undefined or null.");
tryQueryAndDelete();
function tryQueryAndDelete(continuation) {
var requestOptions = {continuation: continuation};
console.log(requestOptions);
var isAccepted = collection.queryDocuments(collectionLink, query, requestOptions, function (err, retrievedDocs, responseOptions) {
if (err) throw err;
if (retrievedDocs.length > 0) {
// Begin deleting documents as soon as documents are returned form the query results.
// tryDelete() resumes querying after deleting; no need to page through continuation tokens.
// - this is to prioritize writes over reads given timeout constraints.
tryDelete(retrievedDocs);
} else if (responseOptions.continuation) {
// Else if the query came back empty, but with a continuation token; repeat the query w/ the token.
tryQueryAndDelete(responseOptions.continuation);
} else {
// Else if there are no more documents and no continuation token - we are finished deleting documents.
responseBody.continuation = false;
response.setBody(responseBody);
}
});
// If we hit execution bounds - return continuation: true.
if (!isAccepted) {
console.log("tryquerydelete not accepted");
response.setBody(responseBody);
}
}
// Recursively deletes documents passed in as an array argument.
// Attempts to query for more on empty array.
function tryDelete(documents) {
if (documents.length > 0) {
// Delete the first document in the array.
var isAccepted = collection.deleteDocument(documents[0]._self, {}, function (err, responseOptions) {
if (err) throw err;
responseBody.deleted++;
console.log("hi");
documents.shift();
// Delete the next document in the array.
tryDelete(documents);
console.log(isAccepted);
});
// If we hit execution bounds - return continuation: true.
if (!isAccepted) {
console.log("trydelete not accepted");
response.setBody(responseBody);
}
} else {
// If the document array is empty, query for more documents.
tryQueryAndDelete();
}
}
}
您只能使用BulkExecutor批量删除,而不能从门户中删除,您一次只能从门户中删除一项。
我会以不同的方式处理环境设置。我建议您为每个环境创建单独的资源组,或者至少为生产创建另一个集合。对于资源组解决方案以降低成本,只需在不使用时拆除测试环境即可。
正如 Rob Reagan 的回答 已经澄清的那样,从容器中清除所有项目与从数据库中清除所有项目之间存在差异。但是,删除整个容器以删除所有项目可能会在某些情况下导致问题。通常,容器是通过 Terraform 等基础设施即代码 (IaC) 定义和创建的,或者通过 Cosmos 客户端直接在代码中定义和创建。删除容器时,必须确保使用相同的配置再次创建它或重新运行 IaC。如果删除容器时 Cosmos 客户端正在运行(例如,在已部署的服务中),则当容器不存在时,客户端将返回有关容器存在的错误(例如
404 NotFound
)。
由于目前无法从 Azure 门户中的容器中删除所有项目,因此您可以使用已经提到的解决方法。
另一种方法是使用外部工具,利用 Cosmos 客户端删除所有现有容器项。由于我遇到了同样的问题并且没有遇到这样的工具,因此我构建了自己的 Visual Studio Code Extension。如果您愿意,可以亲自尝试一下并从marketplace 安装它。您还可以克隆存储库并对其进行修改以满足您的需求。