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

17

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

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

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

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

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

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

    
задан Ryan Worsley 13.04.2012 в 20:07
источник

4 ответа

9

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

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 Сохранение запроса на диск

    
ответ дан Ryan Worsley 19.04.2012 в 08:30
источник
22

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

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 .

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

    
ответ дан alexn 24.10.2012 в 14:25
источник
6

У меня была эта проблема, и это решение, которое сработало для меня. Я работаю только в тестовом проекте, так что это может быть медленным для большего 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();
        }
    }
    
ответ дан peinearydevelopment 09.01.2014 в 18:59
источник
4

Вы можете сделать это, используя: Ссылка

    
ответ дан Ayende Rahien 14.04.2012 в 17:00
источник