.net Azure Cosmos DB -删除整个分区

tjjdgumg  于 2023-03-31  发布在  .NET
关注(0)|答案(3)|浏览(120)

我对cosmos Db非常陌生,并且需要删除完整的分区。在进行简短的研究时,我发现删除分区不是一件事。因此,我偶然发现了以下链接,这是批量删除的存储过程
https://github.com/Azure/azure-cosmosdb-js-server/blob/master/samples/stored-procedures/bulkDelete.js
我在我的集合上创建了这个存储过程,并单击“执行”。

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

flmtquvp

flmtquvp1#

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

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令牌作为参数传递给存储过程并执行存储过程多次。
有任何问题,请告诉我。谢谢。

xqk2d5yq

xqk2d5yq2#

如果您正在创建上面的存储过程,请确保在执行时您将给予分区键的值,而不是分区键列的名称。
另外Cosmos DB存储过程一次只能在一个分区中运行,并且与您传入Input(分区键值)的分区相同。

hkmswyz6

hkmswyz63#

我们现在可以delete items by partition key。该功能目前处于公开预览中,Java和.NET SDK支持也可在预览包中使用。

相关问题