乌鸦DB:我怎样才能删除指定类型的所有文件(Raven DB: How can I delete a

2019-07-28 23:03发布

在乌鸦DB更具体地讲,我想创建一个像一个签名的一般方法;

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

然后让乌鸦DB明确给定类型的所有文件。

我从其他的帖子Ayende到你需要到位的索引要做到这一点作为批处理类似的问题理解。

我认为这将涉及创建每个文档类型映射的索引 - 这似乎是一个大量的工作。

有谁知道创建这样做会中的一组数据库中直接删除上述方法的有效方式?

Answer 1:

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

第一次操作删除的项目。 第二删除希洛文件 。

另外,请查阅官方文档- 如何使用索引来删除或更新文档 。



Answer 2:

多次实验后,我找到了答案,是非常简单的,虽然谈不上明显;

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”将允许您使用该属性的索引。

它在其他地方已经说了,但它也是值得注意的是,一旦你定义一个静态指标乌鸦可能会使用它,这可能会导致您的查询看似不返回你插入的数据:

RavenDB保存到磁盘查询



Answer 3:

我有这个问题,以及这是为我工作的解决方案。 我只是在测试项目中工作,所以这可能是一个更大的分贝缓慢,但瑞安的回答并没有为我工作。

    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();
        }
    }


Answer 4:

你可以这样做,使用: http://blog.orangelightning.co.uk/?p=105



文章来源: Raven DB: How can I delete all documents of a given type
标签: ravendb