Ravendb Raven DB:如何删除给定类型的所有文档

Ravendb Raven DB:如何删除给定类型的所有文档,ravendb,Ravendb,更具体地说,在Raven DB中,我想创建一个带有签名的通用方法,如 public void Clear<T>() {... public void Clear(){。。。 然后让Raven DB清除给定类型的所有文档 我从Ayende的其他帖子中了解到类似的问题,你需要一个索引来批量完成这项工作 我认为这需要创建一个映射每种文档类型的索引——这似乎需要做很多工作 是否有人知道一种有效的方法来创建类似上述的方法,该方法将直接在数据库中执行set delete操作?您可以使用: 经

更具体地说,在Raven DB中,我想创建一个带有签名的通用方法,如

public void Clear<T>() {...
public void Clear(){。。。
然后让Raven DB清除给定类型的所有文档

我从Ayende的其他帖子中了解到类似的问题,你需要一个索引来批量完成这项工作

我认为这需要创建一个映射每种文档类型的索引——这似乎需要做很多工作

是否有人知道一种有效的方法来创建类似上述的方法,该方法将直接在数据库中执行set delete操作?

您可以使用:

经过多次实验后,我发现答案非常简单,尽管远非显而易见

public void Clear()
{
session.Advanced.DocumentStore.DatabaseCommands.PutIndex(indexName,新的IndexDefinitionBuilder
{
Map=documents=>documents.Select(实体=>new{})
});
DeleteByIndex(indexName,new IndexQuery());
}
当然,几乎可以肯定的是,您不会一次性定义索引和删除,为了简洁起见,我将此作为一种方法

我自己的实现按照文档的建议定义了应用程序启动时的索引

如果您想使用此方法实际索引T的属性,则需要约束T。例如,如果我的所有文档类都继承自一个IEntity,并且该类指定了一个属性Id,则“where T:IEntity”将允许您在索引中使用该属性

其他地方也说过,但值得注意的是,一旦定义了静态索引Raven可能会使用它,这可能会导致您的查询似乎不会返回您插入的数据:


我假设您希望从.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
是收藏的实际名称

第一个操作删除项目。第二个操作删除项目


另外,请查看官方文档-。

我也遇到了这个问题,这是对我有效的解决方案。我只是在一个测试项目中工作,所以对于更大的数据库来说,这可能会很慢,但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();
        }
    }
公共静态作废ClearDocuments(此IDocumentSession会话)
{
var objects=session.Query().ToList();
while(objects.Any())
{
foreach(对象中的var obj)
{
删除(obj);
}
session.SaveChanges();
objects=session.Query().ToList();
}
}

Hi Ayende,你的答案真的很有用,但不是我想要的。在对Raven进行了大量实验和了解后,我找到了我想要的解决方案。我将在这里稍后为其他人发布答案。我发现这是最简单的非编程解决方案。我从未找到该博客中提到的重置命令。结果是使用与Ryan的索引相似的索引。这是一种比公认答案更好的方法,因为它不需要创建索引,并且它会删除使用现有索引删除时可能不包含的任何文档。我还希望删除相关的HiLo文档以重置ID。@alexn我可以编辑您的代码来添加它吗?
var HiLo=ssession.Advanced.DocumentStore.DatabaseCommands.Get(“Raven/Hilo/themes”);session.Advanced.DocumentStore.DatabaseCommands.Delete(Hilo.Key,Hilo.Etag);
@SandRock绝对:)上面的代码有一些语法错误。下面是无错误代码var indexQuery=new indexQuery{=“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);}我也在对嵌入式存储运行测试,只有你的解决方案对我有效。Google Groups上的一篇帖子()建议您首先在此场景中创建DocumentsByEntityName索引:“new RavenDocumentsByEntityName().Execute(store);”完成此操作后,我仍然发现应该删除的文档仍然存在(我还防止返回过时的查询,因此这也不是答案).作为RavenDB的贡献者,我不建议这样做,因为你不必要地创建了一个索引。相反,我建议@alexn回答: