RavenDb查询简单地图转换索引

RavenDb查询简单地图转换索引,ravendb,Ravendb,我已经为此挣扎了一段时间了 我有一个client对象clients/513,看起来像这样: { 风险:[ { Id:421eacf0-14e9-4004-ab0b-95d20e976aac, 风险因素:电气设备, 说明:应允许玩电子产品。 }, { Id:4bbecbe2-acfc-45c3-b87a-3321e1eca95a, 风险因素:对员工的暴力, 描述:图雷特 } } 我创建了一个索引,其代码如下: 地图 在docs.Clients中从c开始 从r到c.风险 选择新的{ClientI

我已经为此挣扎了一段时间了

我有一个client对象clients/513,看起来像这样:

{ 风险:[ { Id:421eacf0-14e9-4004-ab0b-95d20e976aac, 风险因素:电气设备, 说明:应允许玩电子产品。 }, { Id:4bbecbe2-acfc-45c3-b87a-3321e1eca95a, 风险因素:对员工的暴力, 描述:图雷特 } } 我创建了一个索引,其代码如下:

地图

在docs.Clients中从c开始 从r到c.风险 选择新的{ClientId=c.Id,RiskId=r.Id} 转化

在结果中使用c 从r到c.风险 选择新的{ClientId=c.Id,RiskId=r.Id} 我想我知道,映射只定义了您希望能够搜索的属性,而转换以特定的形状返回实际数据

我想返回ClientId、RiskId和其他一些与风险相关的属性,这样我就可以这样做。但是,在执行查询时,我似乎得到了一些不一致的结果。它喜欢更改返回的结果数量,这取决于我执行查询的次数,有时是4次,有时是5次

另外:按RiskId筛选似乎返回一个,有时返回多个风险,id不是指定的id


如果有任何帮助,我们将不胜感激。

您不需要转换。以下是一个索引,它将对您尝试执行的操作更加有用:

公共类ClientRiskIndex:AbstractIndexCreationTask { 公共客户索引 { Map=客户机=>来自客户机中的c 从r到c.风险 选择新的{ ClientId=c.Id, 风险Id=风险Id, r、 风险因素, r、 描述 }; StoreAllFieldsFieldsStorage。是; } } 这假定类结构如下所示:

公共类客户端 { 公共字符串Id{get;set;} 公共IList风险{get;set;} } 公共类风险 { 公共Guid Id{get;set;} 公共字符串风险因子{get;set;} 公共字符串说明{get;set;} } 公共类ClientRiskResult { 公共字符串ClientId{get;set;} 公共Guid RiskId{get;set;} 公共字符串风险因子{get;set;} 公共字符串说明{get;set;} } 现在,当您进行查询时,可以执行以下操作:

会话查询 其中x=>x.风险系数==电气设备 .A项目; 如果您希望对风险描述进行全文搜索,只需在索引定义中添加以下行:

Indexx=>x.描述,FieldIndexing.分析; 然后您可以像这样搜索:

会话查询 .Searchx=>x.说明,电子产品 .A项目; 请注意,通过将数据存储在索引中并从中投影,最终将获得一致的结果。这可能是您描述的结果的来源。您需要为索引变为非标度留出时间,或者需要专门定制查询以等待


在现实世界中,您将有足够的时间来编制索引以赶上进度。在您的测试中,通过在查询中使用.Customizex=>x.WaitForNonSaleResults来模拟这一点。

您不需要进行转换。以下是一个索引,它将对您尝试执行的操作更加有用:

公共类ClientRiskIndex:AbstractIndexCreationTask { 公共客户索引 { Map=客户机=>来自客户机中的c 从r到c.风险 选择新的{ ClientId=c.Id, 风险Id=风险Id, r、 风险因素, r、 描述 }; StoreAllFieldsFieldsStorage。是; } } 这假定类结构如下所示:

公共类客户端 { 公共字符串Id{get;set;} 公共IList风险{get;set;} } 公共类风险 { 公共Guid Id{get;set;} 公共字符串风险因子{get;set;} 公共字符串说明{get;set;} } 公共类ClientRiskResult { 公共字符串ClientId{get;set;} 公共Guid RiskId{get;set;} 公共字符串风险因子{get;set;} 公共字符串说明{get;set;} } 现在,当您进行查询时,可以执行以下操作:

会话查询 其中x=>x.风险系数==电气设备 .A项目; 如果您希望对风险描述进行全文搜索,只需在索引定义中添加以下行:

Indexx=>x.描述,FieldIndexing.分析; 然后您可以像这样搜索:

会话查询 .Searchx=>x.说明,电子产品 .A项目; 请注意,通过存储 索引中的数据并从中进行投影,最终会得到一致的结果。这可能就是您描述的结果的来源。您需要为索引变为非标度留出时间,或者需要专门定制查询以等待

在现实世界中,你将有足够的时间去追赶。在测试中,通过在查询中使用.Customizex=>x.WaitForNonSaleResults等待来模拟这一点