Удаление документов из CosmosDB на основе условия через Query Explorer
Какой запрос или какой-либо другой быстрый способ удалить все документы, соответствующие условию where в коллекции?
Мне нужно что-то вроде DELETE * FROM c WHERE c.DocumentType = 'EULA'
, но, по-видимому, оно не работает.
Примечание. Я не ищу реализацию С# для этого.
Ответы
Ответ 1
Мне нужно что-то вроде DELETE * FROM c WHERE c.DocumentType = 'EULA' но, по-видимому, он не работает.
Удаление документов таким образом не поддерживается. Вам нужно будет сначала выбрать документы, используя запрос SELECT, а затем удалить их отдельно. Если вы хотите, вы можете написать код для извлечения и удаления в хранимой процедуре, а затем выполнить эту хранимую процедуру.
Ответ 2
Это немного устарело, но у него было такое же требование, и он нашел конкретный пример того, о чем писал @Gaurav Mantri.
Сценарий хранимой процедуры находится здесь:
https://social.msdn.microsoft.com/Forums/azure/en-US/ec9aa862-0516-47af-badd-dad8a4789dd8/delete-multiple-docdb-documents-within-the-azure-portal?forum=AzureDocumentDB
Перейдите на портал Azure, возьмите сценарий сверху и создайте новую хранимую процедуру в коллекции database->, которую необходимо удалить.
Затем прямо в нижней части панели хранимой процедуры, под сценарием textarea, находится место для ввода параметра. В моем случае я просто хочу удалить все, поэтому я использовал:
SELECT c._self FROM c
Я думаю, что ваш будет
SELECT c._self FROM c WHERE c.DocumentType = 'EULA'
Затем нажмите "Сохранить и выполнить". Виола, некоторые документы удаляются. После того, как я запустил его на портале Azure, я переключился на Azure DocumentDB Studio и получил лучшее представление о происходящем. Т.е. я мог видеть, что меня удушило удаление 18 раз (вернуло в результатах). По какой-то причине я не смог увидеть это на портале Azure.
Во всяком случае, довольно удобно, даже если ограничено определенным количеством удалений за исполнение. Выполнение sp также ограничено, поэтому вы не можете просто помять клавиатуру. Я думаю, что я бы просто удалил и заново создал Коллекцию, если бы у меня не было управляемого количества документов для удаления (мышление <500).
Рекомендует Мими Генц @Microsoft для обмена сценарием по ссылке выше.
НТН
Ответ 3
Я написал скрипт для перечисления всех документов и удаления всех документов, его также можно изменить, чтобы удалить выбранные документы.
var docdb = require("documentdb");
var async = require("async");
var config = {
host: "https://xxxx.documents.azure.com:443/",
auth: {
masterKey: "xxxx"
}
};
var client = new docdb.DocumentClient(config.host, config.auth);
var messagesLink = docdb.UriFactory.createDocumentCollectionUri("xxxx", "xxxx");
var listAll = function(callback) {
var spec = {
query: "SELECT * FROM c",
parameters: []
};
client.queryDocuments(messagesLink, spec).toArray((err, results) => {
callback(err, results);
});
};
var deleteAll = function() {
listAll((err, results) => {
if (err) {
console.log(err);
} else {
async.forEach(results, (message, next) => {
client.deleteDocument(message._self, err => {
if (err) {
console.log(err);
next(err);
} else {
next();
}
});
});
}
});
};
var task = process.argv[2];
switch (task) {
case "listAll":
listAll((err, results) => {
if (err) {
console.error(err);
} else {
console.log(results);
}
});
break;
case "deleteAll":
deleteAll();
break;
default:
console.log("Commands:");
console.log("listAll deleteAll");
break;
}