diff --git a/src/Common/dataAccess/deleteDocument.ts b/src/Common/dataAccess/deleteDocument.ts index 535dea0a8..e51fad2ce 100644 --- a/src/Common/dataAccess/deleteDocument.ts +++ b/src/Common/dataAccess/deleteDocument.ts @@ -36,27 +36,42 @@ export const deleteDocuments = async (collection: CollectionBase, documentIds: D const clearMessage = logConsoleProgress(`Deleting ${documentIds.length} ${getEntityName(true)}`); try { const v2Container = await client().database(collection.databaseId).container(collection.id()); - const operations: OperationInput[] = documentIds.map((documentId) => ({ - id: documentId.id(), - // bulk delete: if not partition key is specified, do not pass empty array, but undefined - partitionKey: - documentId.partitionKeyValue && - Array.isArray(documentId.partitionKeyValue) && - documentId.partitionKeyValue.length === 0 - ? undefined - : documentId.partitionKeyValue, - operationType: BulkOperationType.Delete, - })); - const bulkResult = await v2Container.items.bulk(operations); - const result: DocumentId[] = []; - documentIds.forEach((documentId, index) => { - if (bulkResult[index].statusCode === 204) { - result.push(documentId); - } - }); - logConsoleInfo(`Successfully deleted ${getEntityName(true)}: ${result.length} out of ${documentIds.length}`); + + // Bulk can only delete 100 documents at a time + const BULK_DELETE_LIMIT = 100; + const promiseArray = []; + + while (documentIds.length > 0) { + const documentIdsChunk = documentIds.splice(0, BULK_DELETE_LIMIT); + const operations: OperationInput[] = documentIdsChunk.map((documentId) => ({ + id: documentId.id(), + // bulk delete: if not partition key is specified, do not pass empty array, but undefined + partitionKey: + documentId.partitionKeyValue && + Array.isArray(documentId.partitionKeyValue) && + documentId.partitionKeyValue.length === 0 + ? undefined + : documentId.partitionKeyValue, + operationType: BulkOperationType.Delete, + })); + + const promise = v2Container.items.bulk(operations).then((bulkResult) => { + const result: DocumentId[] = []; + documentIdsChunk.forEach((documentId, index) => { + if (bulkResult[index].statusCode === 204) { + result.push(documentId); + } + }); + return result; + }); + promiseArray.push(promise); + } + + const allResult = await Promise.all(promiseArray); + const flatAllResult = Array.prototype.concat.apply([], allResult); + logConsoleInfo(`Successfully deleted ${getEntityName(true)}: ${flatAllResult.length} out of ${documentIds.length}`); // TODO: handle case result.length != documentIds.length - return result; + return flatAllResult; } catch (error) { handleError(error, "DeleteDocuments", `Error while deleting ${documentIds.length} ${getEntityName(true)}`); throw error;