代码之家  ›  专栏  ›  技术社区  ›  coderman

Azure Cosmos DB-删除整个分区

  •  -1
  • coderman  · 技术社区  · 6 年前

    我对cosmos Db很陌生,需要删除一个完整的分区。在做了一个简短的研究后,我发现删除分区不是一回事。因此,我偶然发现了以下链接,这是一个用于批量删除的存储过程

    https://github.com/Azure/azure-cosmosdb-js-server/blob/master/samples/stored-procedures/bulkDelete.js

    我在集合上创建了此存储过程,并单击“执行”。我得到了以下提示

    enter image description here

    我输入了分区键并输入参数“select*from c”。但是,我可以看到一次只删除了38个文档,查询成功完成。是否有任何设置强制存储过程过早停止?

    1 回复  |  直到 5 年前
        1
  •  2
  •   marc_s Hady Salah    5 年前

    正如您在评论中提到的,您的情况取决于分配的RUs。我提供了以下示例存储过程代码。您可以参考它。

    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秒的执行限制。如果遇到超时错误,可以将continuation标记作为参数传递到存储过程中,并多次执行存储过程。

    有什么问题,请告诉我。谢谢您。

        2
  •  0
  •   marc_s Hady Salah    5 年前

    如果要创建上述存储过程,请确保在执行时提供分区键的值,而不是分区键列的名称。