Удаление документов из 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;
}