Подтвердить что ты не робот

Raven DB: как я могу удалить все документы определенного типа?

В частности, в Raven DB я хочу создать общий метод с такой сигнатурой, как:

public void Clear<T>() {...

Затем Raven DB очистит все документы данного типа.

По другим сообщениям Айенде я понимаю похожие вопросы, что вам нужен индекс, чтобы сделать это как пакет.

Я думаю, что это связано с созданием индекса, который отображает каждый тип документа - это похоже на большую работу.

Кто-нибудь знает эффективный способ создания метода, подобного выше, который будет выполнять набор delete непосредственно в базе данных?

4b9b3361

Ответ 1

После долгих экспериментов я нашел ответ довольно простым, хотя и не очевидным,

public void Clear<T>()
{
    session.Advanced.DocumentStore.DatabaseCommands.PutIndex(indexName, new IndexDefinitionBuilder<T>
    {
        Map = documents => documents.Select(entity => new {})
    });

    session.Advanced.DatabaseCommands.DeleteByIndex(indexName, new IndexQuery());
}

Конечно, вы почти наверняка не определяете свой индекс и не делаете свое удаление за один раз, я кратко изложил это как один метод для краткости.

Моя собственная реализация определяет индексы при запуске приложения, как рекомендовано в документации.

Если вы хотите использовать этот подход для фактического индексации свойства T, вам нужно будет ограничить T. Например, если у меня есть IEntity, что все мои классы документов наследуются, а этот класс указывает идентификатор свойства. Затем "где T: IEntity" позволит вам использовать это свойство в индексе.

Это было сказано в других местах, но также стоит отметить, что как только вы определите статический индекс, который, вероятно, будет использовать Raven, это может привести к тому, что ваши запросы, казалось бы, не возвратят данные, которые вы вставили:

RavenDB Сохранение запроса на диск

Ответ 2

Предполагаю, что вы хотите сделать это от клиента .NET. Если это так, используйте стандартный индекс DocumentsByEntityName:

var indexQuery = new IndexQuery { Query = "Tag:" + collectionName };
session.Advanced.DocumentStore.DatabaseCommands.DeleteByIndex(
   "Raven/DocumentsByEntityName", 
   indexQuery, 
   new BulkOperationOptions { AllowStale = true });

var hilo = session.Advanced.DocumentStore.DatabaseCommands.Get("Raven/H‌​ilo/", collectionName);
if (hilo != null) {
    session.Advanced.DocumentStore.DatabaseCommands.Delete(hilo.‌​Key, hilo.Etag);
}

Где collectionName - это фактическое имя вашей коллекции.

Первая операция удаляет элементы. Второй удаляет файл HiLo.

Также ознакомьтесь с официальной документацией - Как удалить или обновить документы с помощью индекса.

Ответ 3

У меня была эта проблема, и это решение, которое сработало для меня. Я работаю только в тестовом проекте, так что это может быть медленным для большего db, но ответ Райана не работает для меня.

    public static void ClearDocuments<T>(this IDocumentSession session)
    {
        var objects = session.Query<T>().ToList();
        while (objects.Any())
        {
            foreach (var obj in objects)
            {
                session.Delete(obj);
            }

            session.SaveChanges();
            objects = session.Query<T>().ToList();
        }
    }