【问题标题】:RavenDb querying simple map transform indexRavenDb 查询简单地图变换索引
【发布时间】:2013-01-05 05:25:41
【问题描述】:

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

我有一个如下所示的客户端对象 (clients/513):

{  
  "Risks": [
    {
      "Id": "421eacf0-14e9-4004-ab0b-95d20e976aac",
      "RiskFactor": "ElectricalEquipment",
      "Description": "Should be allowed to play with electronics."
    },
    {
      "Id": "4bbecbe2-acfc-45c3-b87a-3321e1eca95a",
      "RiskFactor": "ViolenceToStaffVerbal",
      "Description": "Tourettes"
    }
}

我创建了一个包含以下代码的索引:

地图

from c in docs.Clients
from r in c.Risks
select new { ClientId = c.Id, RiskId = r.Id }

变换

from c in results
from r in c.Risks
select new { ClientId = c.Id, RiskId = r.Id }

认为我了解 MAP 只是定义了您希望能够搜索的属性。并且 TRANSFORM 以某种形状返回实际数据。

我想返回 ClientId、RiskId 以及可能与风险相关的其他一些属性,以便我可以执行 .As<ViewModel>() ,但是当我执行查询时似乎得到了一些不一致的结果。 (它喜欢改变它返回的结果数量,这取决于我执行查询的次数,有时是 4 次,有时是 5 次)。

另外:按 RiskId 过滤似乎会返回一个,有时会返回多个风险,其 id 不是指定的 Id。

任何帮助将不胜感激。

【问题讨论】:

    标签: ravendb


    【解决方案1】:

    您不需要转换。这是一个对您尝试做的事情更有用的索引:

    public class ClientRiskIndex : AbstractIndexCreationTask<Client, ClientRiskResult>
    {
        public ClientRiskIndex()
        {
            Map = clients => from c in clients
                             from r in c.Risks
                             select new {
                                            ClientId = c.Id,
                                            RiskId = r.Id,
                                            r.RiskFactor,
                                            r.Description
                                        };
    
            StoreAllFields(FieldStorage.Yes);
        }
    }
    

    假设类结构如下:

    public class Client
    {
        public string Id { get; set; }
        public IList<Risk> Risks { get; set; }
    }
    
    public class Risk
    {
        public Guid Id { get; set; }
        public string RiskFactor { get; set; }
        public string Description { get; set; }
    }
    
    public class ClientRiskResult
    {
        public string ClientId { get; set; }
        public Guid RiskId { get; set; }
        public string RiskFactor { get; set; }
        public string Description { get; set; }
    }
    

    现在,当您查询时,您可以执行以下操作:

    session.Query<ClientRiskResult, ClientRiskIndex>()
           .Where(x => x.RiskFactor == "ElectricalEquipment")
           .AsProjection<ClientRiskResult>();
    

    如果您想对风险描述进行全文搜索,只需将此行添加到索引定义中:

    Index(x => x.Description, FieldIndexing.Analyzed);
    

    然后你可以这样搜索:

    session.Query<ClientRiskResult, ClientRiskIndex>()
           .Search(x => x.Description, "electronics")
           .AsProjection<ClientRiskResult>();
    

    请注意,通过将数据存储在索引中并从中进行投影,您将获得“最终一致”的结果。这可能是您描述的结果的来源。您需要留出时间让索引变得陈旧,或者您需要专门自定义要等待的查询。

    在现实世界中,您将有大量时间进行索引编制。在您的测试中,通过在查询中等待 .Customize(x=&gt; x.WaitForNonStaleResults()) 来模拟这一点。

    【讨论】:

      猜你喜欢
      • 2016-05-21
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      相关资源
      最近更新 更多