更具体地说,在 Raven DB 中,我想创建一个带有如下签名的通用方法:
public void Clear<T>() {...
然后让 Raven DB 清除所有给定类型的文档。
我从 Ayende 的其他类似问题的帖子中了解到,您需要先建立索引才能作为批处理执行此操作。
我认为这将涉及创建一个将每种文档类型映射到其自身的索引 - 这似乎是很费力的。
有没有人知道一种高效的方法来创建像上面那样直接在数据库中进行集合删除的方法?
更具体地说,在 Raven DB 中,我想创建一个带有如下签名的通用方法:
public void Clear<T>() {...
然后让 Raven DB 清除所有给定类型的文档。
我从 Ayende 的其他类似问题的帖子中了解到,您需要先建立索引才能作为批处理执行此操作。
我认为这将涉及创建一个将每种文档类型映射到其自身的索引 - 这似乎是很费力的。
有没有人知道一种高效的方法来创建像上面那样直接在数据库中进行集合删除的方法?
我假设您希望从.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文件。
此外,请参阅官方文档-如何使用索引删除或更新文档。
经过许多实验,我发现答案非常简单,尽管远非显而易见;
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());
}
我也遇到过这个问题,以下是解决方法。我只在一个测试项目中使用,所以对于更大的数据库可能会慢一些,但Ryan的答案对我没有起作用。
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();
}
}
var hilo = session.Advanced.DocumentStore.DatabaseCommands.Get("Raven/Hilo/themes"); session.Advanced.DocumentStore.DatabaseCommands.Delete(hilo.Key, hilo.Etag);
- SandRock