RavenDB复杂索引

问题描述:

尽管我对使用RavenDB作为OLTP应用程序存储的想法感到非常兴奋,但我在Linq/Map-Reduce索引实现方面有点麻烦。RavenDB复杂索引

这里是我想要做的事 - 我的文档 -

Event { 
    UserId: "1", 
    Location : "X", 
    EventDate : "1/1/2010", 
    EventType : "type A" 
} 
... 
Event { 
    UserId: "2", 
    Location : "Y", 
    EventDate : "1/1/2011", 
    EventType : "type B" 
} 

应该执行的操作查询/索引

“给我算对特定用户的不同事件

Location | Count(EventA) | Count(EventB) 
--------------------------------------- 
X  | 10   |  2 
Y  | 4   | 22 
:通过位置,事件”

结果示例分组特定日期范围

我相信这应该是直截了当的。我可能只是想念一些东西。

谢谢你的帮助!

你在问什么是报告的典型案例。 RavenDB并不适合(http://ravendb.net/docs/server/bundles/index-replication)。您的问题类似于SQL Server Analysis Services中多维数据集的结构。

enter image description here

在这种情况下的问题是时间范围。如果范围是固定的,比如说我想知道每个月的情况,你可以在索引中做到这一点,但如果范围是临时的,那么我相信在Raven中这是不可能的,通过使用索引并且可能不是一个查询,因为你必须做分组客户端,因此将不得不检索大量的文档(远远超过Raven的默认值128)。

但万一有人通过例如在我们省略的时间范围的索引搜索的多组,然后以下索引的实现,其中结果是由用户标识分组,位置和事件类型可以是一种解决方案:

public class Index : AbstractIndexCreationTask<Index.Result> 
{ 
    public class Result 
    { 
     public string UserId { get; set; } 
     public string Location { get; set; } 
     public string EventType { get; set; } 
     public int Count { get; set; } 
    } 

    public Index() 
    { 
     Map = events => from e in events 
         select new Result 
         { 
          UserId = e.UserId, 
          Location = e.Location, 
          EventType = e.EventType, 
          Count = 1 
         }; 

     Reduce = results => from result in results 
          group result by new { result.UserId, result.Location, result.EventType } 
           into g 
           select new Result 
           { 
            UserId = g.Key.UserId, 
            Location = g.Key.Location, 
            EventType = g.Key.EventType, 
            Count = g.Sum(x => x.Count) 
           }; 
    } 
} 

这会给你这样的结果

UserId | Location | EventType  | Count 
------------------------------------------- 
1  | X  | A    |  2 
1  | X  | B    |  4 
1  | Y  | A    | 22 
1  | Y  | B    |  6 
2  | X  | A    |  7 
2  | X  | B    |  3 
2  | Y  | A    |  9 
2  | Y  | B    | 16 

然后,您可以查询该指数和做对查询结果的附加分组。

+1

很好的答案。你遇到了问题的核心 - 你不能有任意的日期范围。如果你想让他们每天,每周,每月等分组,那么你可以。可能使用多个索引并将结果交叉使其感觉更加随意。我一直在计划一会儿... – 2013-02-28 20:37:13