Ravendb索引2个嵌套了多一的关系实体



我在ravendb中有以下实体集合:

public class Provider
{
    public string ProviderId {get; set;}
    public string ProviderName {get; set;}
    public string[] CategoryIds{get; set;}
}
public class Category
{
    public string CategoryId {get; set;}
    public string CategoryName {get; set;}
    public string[] ServiceIds {get; set;}
}
public class Service
{
    public string ServiceId {get; set;}
    public string ServiceName {get; set;}
    public string ServiceCode {get; set;}
}

这是一个2级的多对多关系。现在,我需要创建索引以平整结构,因此我搜索结果。

  1. 可以提供某个服务的搜索提供商
  2. 包含某个服务的搜索类别
  3. 提供商可以提供的搜索服务

我的索引结果模型应该喜欢:

public class ProviderCategoryService
{
    public string ProviderId {get; set;}
    public string ProviderName {get; set;}
    public string CategoryId {get; set;}
    public string CategoryName {get; set;}
    public string ServiceId {get; set;}
    public string ServiceName {get; set;}
    public string ServiceCode {get; set;}
}

我可以仅以一个索引来实现上述功能,还是需要创建多个索引?

*编辑:使用多个字段然后使用Transformer的组。*

我提出了这个索引。

public class ProviderCategoryServiceSearch:AbstractMultiMapIndexCreationTask<IndexResult>
{
    public ProviderCategoryServiceSearch()
    {
        AddMap<Provider>(providers => from p in providers from c in p.CategoryIds
            select new {
                ProviderId = p.ProviderId,
                ProviderName = p.ProviderName,
                CategoryId = c,           
                CategoryName = (string)null,
                ServiceId = (string)null,
                ServiceName = (string)null,
                ServiceCode = (string)null,
        });
        AddMap<Category>(categories => from c in categories from s in ServiceIds
            select new {
                ProviderId = (string)null,
                ProviderName = (string)null,
                CategoryId = c.CategoryId,           
                CategoryName = c.CategoryName,
                ServiceId = s,
                ServiceName = (string)null,
                ServiceCode = (string)null,
        });
        Reduce = results => from r in results
            group r by new {r.CategoryId, r.ServiceId} into g
            from record in g
            select new {
                ProviderId = g.Select(x => x.ProviderId).FirstOrDefault(x => x != null),
                ProviderName = g.Select(x => x.ProviderName).FirstOrDefault(x => x != null),
                CategoryId = g.Key.CategoryId,           
                CategoryName = g.Select(x => x.CategoryName).FirstOrDefault(x => x != null),
                ServiceId = g.Key.ServiceId,
                ServiceName = (string)null,
                ServiceCode = (string)null,
             };
    }

    public class MyTransformer : AbstractTransformerCreationTask<IndexResult>
    {
        public MyTransformer()
        {
             TransformResults = results => from r in results
                 let s= LoadDocument<Service>(r.ServiceId)
                 select new {
                     ProviderId = r.ProviderId,
                    ProviderName = r.ProviderName,
                    CategoryId = r.CategoryId,           
                    CategoryName = r.CategoryName,
                    ServiceId = r.ServiceId,
                    ServiceName = s.ServiceName,
                    ServiceCode = s.ServiceCode,
            };
        }
    }
}

此实现有任何问题吗?

该方法还可以。这是在Raven 1.0中完成事情的方式。但是,由于在2.0和2.5中引入LoadDocument以来,它已成为不必要的。在这里阅读更多。您会发现当可以将相关文档加载到索引映射中时,您不需要多图像或减少。

最新更新