Azure Cosmos DB - 删除整个分区
Azure Cosmos DB - Delete entire partition
本人刚接触cosmos Db,有删除一个完整分区的需求。在进行简短的研究时,我发现删除分区不是问题。因此,我偶然发现了以下 link,它是批量删除的存储过程
我在 collection 上创建了这个存储过程并单击了 'Execute'。我得到以下提示
我输入了分区键和输入参数给'select * from c'。但是,我可以看到一次只删除了 38 个文档,查询成功完成。是否有任何设置强制存储过程过早停止?
正如您在评论中提到的,您的情况取决于 RU allocated.I 为您提供了以下示例存储过程 code.You 可以参考。
function deleteSproc(query) {
var collection = getContext().getCollection();
var collectionLink = collection.getSelfLink();
var response = getContext().getResponse();
var responseBody = {
deleted: 0,
continuation: ""
};
// Validate input.
if (!query) throw new Error("The query is undefined or null.");
tryQueryAndDelete();
function tryQueryAndDelete(continuation) {
var requestOptions = {
continuation: continuation,
pageSize: 10
};
var isAccepted = collection.queryDocuments(collectionLink, query, requestOptions, function (err, documents, responseOptions) {
if (err) throw err;
if (documents.length > 0) {
tryDelete(documents);
if(responseOptions.continuation){
tryQueryAndDelete(responseOptions.continuation);
}else{
response.setBody(responseBody);
}
}
});
if (!isAccepted) {
response.setBody(responseBody);
}
}
function tryDelete(documents) {
if (documents.length > 0) {
var requestOptions = {etag: documents[0]._etag};
// Delete the document.
var isAccepted = collection.deleteDocument(
documents[0]._self,
requestOptions,
function (err, updatedDocument, responseOptions) {
if (err) throw err;
responseBody.deleted++;
documents.shift();
// Try updating the next document in the array.
tryDelete(documents);
}
);
if (!isAccepted) {
response.setBody(responseBody);
}
}
}
}
此外,据我所知,存储过程有 5 秒的执行限制。如果您遇到超时错误,您可以将继续令牌作为参数传递给存储过程并执行存储过程多次。
如有任何疑问,请告诉我。谢谢。
如果您正在创建上述存储过程,请确保在执行时您将给出分区键的值而不是分区键列的名称。
此外,Cosmos DB 存储过程将 运行 一次仅在一个分区中,并且与您在输入(分区键值)中传递的相同。
本人刚接触cosmos Db,有删除一个完整分区的需求。在进行简短的研究时,我发现删除分区不是问题。因此,我偶然发现了以下 link,它是批量删除的存储过程
我在 collection 上创建了这个存储过程并单击了 'Execute'。我得到以下提示
我输入了分区键和输入参数给'select * from c'。但是,我可以看到一次只删除了 38 个文档,查询成功完成。是否有任何设置强制存储过程过早停止?
正如您在评论中提到的,您的情况取决于 RU allocated.I 为您提供了以下示例存储过程 code.You 可以参考。
function deleteSproc(query) {
var collection = getContext().getCollection();
var collectionLink = collection.getSelfLink();
var response = getContext().getResponse();
var responseBody = {
deleted: 0,
continuation: ""
};
// Validate input.
if (!query) throw new Error("The query is undefined or null.");
tryQueryAndDelete();
function tryQueryAndDelete(continuation) {
var requestOptions = {
continuation: continuation,
pageSize: 10
};
var isAccepted = collection.queryDocuments(collectionLink, query, requestOptions, function (err, documents, responseOptions) {
if (err) throw err;
if (documents.length > 0) {
tryDelete(documents);
if(responseOptions.continuation){
tryQueryAndDelete(responseOptions.continuation);
}else{
response.setBody(responseBody);
}
}
});
if (!isAccepted) {
response.setBody(responseBody);
}
}
function tryDelete(documents) {
if (documents.length > 0) {
var requestOptions = {etag: documents[0]._etag};
// Delete the document.
var isAccepted = collection.deleteDocument(
documents[0]._self,
requestOptions,
function (err, updatedDocument, responseOptions) {
if (err) throw err;
responseBody.deleted++;
documents.shift();
// Try updating the next document in the array.
tryDelete(documents);
}
);
if (!isAccepted) {
response.setBody(responseBody);
}
}
}
}
此外,据我所知,存储过程有 5 秒的执行限制。如果您遇到超时错误,您可以将继续令牌作为参数传递给存储过程并执行存储过程多次。
如有任何疑问,请告诉我。谢谢。
如果您正在创建上述存储过程,请确保在执行时您将给出分区键的值而不是分区键列的名称。
此外,Cosmos DB 存储过程将 运行 一次仅在一个分区中,并且与您在输入(分区键值)中传递的相同。