gpt4 book ai didi

c# - 如何通过c#代码删除DocumentDB中的所有文档

转载 作者:可可西里 更新时间:2023-11-01 03:08:51 24 4
gpt4 key购买 nike

我正在使用 Microsoft 的一个新数据库,称为 DocumentDB。现在我想按 ID 删除文档,但我不知道该怎么做。 DocumentDB 中的删除操作需要自链接,它们与我自己的 id 不同。但是我查询一次文档,然后我将获得 self 链接。通过该 self 链接,我将删除文档。

现在我想删除我收藏中大约 50000 多个文档的所有文档。

需要获取每个文档然后删除或任何简单的方法来做同样的事情?

这可能吗?

最佳答案

您是正确的,删除​​文档需要引用文档的 _self 链接。

如果您要删除集合中的 ALL 文档 - 删除并重新创建集合可能更简单、更快速。唯一需要注意的是,服务器端脚本(例如存储过程、udfs、触发器)也属于该集合,可能也需要重新创建。

更新:我编写了一个快速存储过程,用于执行给定查询的批量删除。这使您可以在更少的网络请求中执行批量删除操作。

/**
* A DocumentDB stored procedure that bulk deletes documents for a given query.<br/>
* Note: You may need to execute this sproc multiple times (depending whether the sproc is able to delete every document within the execution timeout limit).
*
* @function
* @param {string} query - A query that provides the documents to be deleted (e.g. "SELECT * FROM c WHERE c.founded_year = 2008")
* @returns {Object.<number, boolean>} Returns an object with the two properties:<br/>
* deleted - contains a count of documents deleted<br/>
* continuation - a boolean whether you should execute the sproc again (true if there are more documents to delete; false otherwise).
*/
function bulkDeleteSproc(query) {
var collection = getContext().getCollection();
var collectionLink = collection.getSelfLink();
var response = getContext().getResponse();
var responseBody = {
deleted: 0,
continuation: true
};

// Validate input.
if (!query) throw new Error("The query is undefined or null.");

tryQueryAndDelete();

// Recursively runs the query w/ support for continuation tokens.
// Calls tryDelete(documents) as soon as the query returns documents.
function tryQueryAndDelete(continuation) {
var requestOptions = {continuation: continuation};

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) {
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++;
documents.shift();
// Delete the next document in the array.
tryDelete(documents);
});

// If we hit execution bounds - return continuation: true.
if (!isAccepted) {
response.setBody(responseBody);
}
} else {
// If the document array is empty, query for more documents.
tryQueryAndDelete();
}
}
}

关于c# - 如何通过c#代码删除DocumentDB中的所有文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29137708/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com