Sie haben Recht, dass das Löschen von Dokumenten einen Verweis auf die Verknüpfung _self
des Dokuments erfordert.
Wenn Sie löschen möchten ALLE Dokumente in Ihrer Sammlung - es kann einfacher und schneller zu löschen und die Sammlung neu erstellen. Die einzige Einschränkung besteht darin, dass serverseitige Skripts (z. B. Sprocs, UDFs, Trigger) ebenfalls zur Sammlung gehören und möglicherweise ebenfalls neu erstellt werden müssen.
Update: Ich schrieb eine schnelle gespeicherte Prozedur, die eine Massenlöschung bei einer Abfrage durchführt. Auf diese Weise können Sie Vorgänge zum Löschen von Daten in weniger Netzwerkanforderungen durchführen.
/**
* 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();
}
}
}
(in Java) I möchte auch alle Dokumente einer bestimmten Sammlung löschen. Es scheint nicht möglich, SQL-Syntax zu verwenden. Zum Beispiel ist "DELETE FROM WHERE" heute nicht verfügbar. Ich stimme für [dieses Feedback] (http://feedback.azure.com/forums/263030-documentdb/suggestions/6346033-set-based-operations-insert-update-delete) ab, das sich im Status "in review" befindet. Ich möchte die Elternkollektion nicht löschen und neu erstellen: Für mich ist das keine akzeptable Problemumgehung. Ich wäre wirklich glücklich, eine Lösung dafür zu bekommen ... – boly38