从嵌入式 RavenDB 中的索引检索结果时出现问题

Posted

技术标签:

【中文标题】从嵌入式 RavenDB 中的索引检索结果时出现问题【英文标题】:Problem retrieving results from an index in an embedded RavenDB 【发布时间】:2011-09-26 20:43:49 【问题描述】:

当我使用 .Net 客户端 API 和基于服务器的 RavenDb 查询它时,我的索引效果很好。

但是,如果我将 RavenDb 更改为嵌入式类型,那么我无法直接查询索引,除非我首先查询索引使用的文档。

例如,如果我有以下文档对象,它们作为单独的集合存在于 RavenDb 中:

private class TestParentDocument
        
            public string Id  get  return GetType().Name + "/" + AggregateRootId;  
            public Guid AggregateRootId  get; set; 
            public string Name  get; set; 
            public string Description  get; set; 
        

private class TestChildProductFlagDocument
        
            public string TestParentDocumentId  get; set; 
            public short ProductFlagTypeId  get; set; 
        

然后我有以下对象,它表示索引映射到的输出文档:

private class TestJoinIndexOutput
        
            public string TestParentDocumentId  get; set; 
            public string Name  get; set; 
            public short ProductFlagTypeId  get; set; 
        

这是索引定义:

private class TestJoinIndex : AbstractIndexCreationTask<TestChildProductFlagDocument, TestJoinIndexOutput>
        
            public TestJoinIndex()
            
                Map = docs => from doc in docs
                              select new
                              
                                  TestParentDocumentId = doc.TestParentDocumentId,
                                  ProductFlagTypeId = doc.ProductFlagTypeId
                              ;

                TransformResults = (database, results) =>
                    from result in results
                    let parentDoc = database.Load<TestParentDocument>(result.TestParentDocumentId)
                    select new
                    
                        TestParentDocumentId = result.TestParentDocumentId,
                        ProductFlagTypeId = result.ProductFlagTypeId, 
                        Name = parentDoc.Name
                    ;
            

我调用索引的代码如下所示:

var theJoinIndexes = ravenSession.Query<TestJoinIndexOutput, TestJoinIndex>().ToList();

这几乎立即返回并失败,除非我执行以下操作:

var theParentDocuments = ravenSession.Query<TestParentDocument>().ToList();
var theJoinIndexes = ravenSession.Query<TestJoinIndexOutput, TestJoinIndex>().ToList();

我的 Ravendb 嵌入式定义如下所示:

docStore = new EmbeddableDocumentStore
                 
                    UseEmbeddedHttpServer = false,
                    RunInMemory = true

                ;
                docStore.Configuration.Port = 7777;
                docStore.Initialize();

                IndexCreation.CreateIndexes(typeof(TestJoinIndex).Assembly, docstore);

【问题讨论】:

【参考方案1】:

您无需等待索引完成,请致电WaitForNonStaleResultsAsOfNow

【讨论】:

行得通!感谢 Ayende - “我可能是个傻瓜,但我打算成为一个活生生的傻瓜” - Matrim Cauthon

以上是关于从嵌入式 RavenDB 中的索引检索结果时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

写入 RavenDb 后立即读取它会返回不一致的数据

RavenDB - 何时使用AbstractIndexCreationTask索引,排序和存储方法?

使用 Windows Azure 上嵌入的 RavenDB 写入日志文件失败

使用 RavenDB 从多个字符串数组创建扇出索引的编译错误

安装 RavenDb Embedded 时出现 Nuget 依赖错误

尝试从一系列字典中检索键时出现“类型错误:列表索引必须是整数或切片,而不是 str”