Поскольку cosmos db не поддерживает удаление документов с помощью SQL ( Удалить SQL для CosmosDB ), вы можете запросить документы и удалить их, удалив SDK один за другим. Или вы можете выбрать массовую операцию в хранимой процедуре.
Вы можете полностью выполнить хранимую процедуру массового удаления образец кода , чтобы реализовать ваши требования, которые работают для меня.
function bulkDeleteProcedure(query) {
var collection = getContext().getCollection();
var collectionLink = collection.getSelfLink();
var response = getContext().getResponse();
var responseBody = {
deleted: 0,
continuation: true
};
query = 'SELECT * FROM c WHERE c.deviceId="device1"';
// 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();
}
}
}
Кроме того, как я знаю, хранимая процедура имеет ограничение на 5 секунд выполнения. Если вы столкнулись с ошибкой тайм-аута, вы можете передать токен продолжения в качестве параметра в хранимую процедуру и выполнить хранимую процедуру несколько раз.
Обновить ответ:
Ключ секционирования необходим для секционированной коллекции в хранимой процедуре (см. Подробное объяснение: Azure Cosmos DB запрашивает ключ секционирования для хранимой процедуры .)
Итак, во-первых, для кода выше необходим ваш ключ раздела. Например, ваш ключ раздела определен как / message / id, а ваши данные указаны ниже:
{
"message":{
"id":"1"
}
}
Тогда вам нужно передать ПК как message/1
.
Очевидно, что ваш запрос sql пересекает разделы, я предлагаю вам использовать функцию лазера http триггера вместо хранимой процедуры. В этой функции вы можете использовать код cosmos db sdk для выполнения запроса и удаления операций. не забудьте установить EnableCrossPartitionQuery
на true
. Пожалуйста, обратитесь к этому случаю: Azure Cosmos DB запрашивает ключ раздела для хранимой процедуры .