【问题标题】:Query all documents when type is unknown类型未知时查询所有文档
【发布时间】:2013-05-12 23:16:52
【问题描述】:

我正在进行集成测试。由于我们使用 NServiceBus Saga 和 ravendb 作为存储,因此对于集成测试,我需要为每个测试用例删除 raven 存储中的所有文档。由于这是一个 NServiceBus 传奇存储,因此 Raven Db 中的文档类型在集成测试中是未知的。基本上我需要阅读所有文件(任何类型)并删除它们。我期待在 ravendb 会话中编写查询,以从特定数据库中检索所有文档。当我检查 Raven Db Query 方法时,它期望文档的类型。而我需要在没有类型的情况下查询数据库中的所有文档。仅供参考,因为这是集成测试,raven store 不会有很多记录。所以性能不是问题。

这是我要执行的查询。

"from doc in docs let DocId = doc[\"@metadata\"][\"@id\"] select new {DocId};"

解决方案 1:

我还尝试为上述查询创建索引并执行 DeleteByIndex。这实际上删除了数据库中的所有文档。但它适用于某些测试用例,并在另一个测试用例中抛出异常,说“陈旧索引”。我还找到了一个解决方案,代码可以等到索引完成以避免过时的异常。或者将 allowtale 设置为 true 以避免此异常。我认为,与其遍历所有索引内容,为什么我不能只编写一个查询来检索所有文档并删除它们。

解决方案 2: 我找到了另一个删除 ravendb 文件夹的解决方案。这不适用于我的情况,因为如果在 NServiceBus Windows 处理器运行时删除数据库,NServices 总线将引发异常。这打破了我们的集成测试用例。集成测试将在与 ravendb 机器不同的机器上运行的另一个原因。因此集成测试盒可能无法访问 ravendb 盒的文件夹。

这些都是我希望编写查询以从数据库中获取所有文档并删除它们的所有原因。

感谢任何帮助。

【问题讨论】:

    标签: ravendb nservicebus


    【解决方案1】:

    我建议您在集成测试中使用 Raven 作为内存数据库运行的能力。这将在您需要时为您提供一个全新的数据库。

    对于您的测试,创建一个EmbeddableDocumentStore(也实现IDocumentStore)并使用RunInMemory 配置选项,而不是DocumentStore

    【讨论】:

    • 正如我在问题中所说,Ravendb 被用作 NServiceBus 传奇文档存储并由 NServicesBus 管理。
    • 但是您可以注入一个使用内存中 Raven 服务器的自定义 ISagaPersister。
    【解决方案2】:

    虽然有一些选项可用于注入内存数据库,但我现在将采用以下路线。但我会将另一个答案标记为已回答,因为使用内存数据库是有意义的。

    此代码删除 raven 数据库中的所有文档。为简单起见忽略文档存储对象初始化

     using (var session = documentStore.OpenSession(database))
                {
                    var result = session.Advanced.LuceneQuery<dynamic>()
                           .SelectFields<dynamic>("@metadata")
                           .Select<dynamic, string>(x => x["__document_id"])
                           .ToArray();
    
                    var loadedDocuments = session.Load<dynamic>(result);
                    foreach (var document in loadedDocuments)
                    {
                        session.Delete(document);
                    }
                    session.SaveChanges();
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 2021-06-29
      • 2012-08-21
      • 1970-01-01
      相关资源
      最近更新 更多