Raven DB: как я могу удалить все документы определенного типа?
В частности, в Raven DB я хочу создать общий метод с такой сигнатурой, как:
public void Clear<T>() {...
Затем Raven DB очистит все документы данного типа.
По другим сообщениям Айенде я понимаю похожие вопросы, что вам нужен индекс, чтобы сделать это как пакет.
Я думаю, что это связано с созданием индекса, который отображает каждый тип документа - это похоже на большую работу.
Кто-нибудь знает эффективный способ создания метода, подобного выше, который будет выполнять набор delete непосредственно в базе данных?
Ответы
Ответ 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/Hilo/", 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();
}
}
Ответ 4
Вы можете сделать это, используя:
http://blog.orangelightning.co.uk/?p=105