你问的是一个典型的举报案例。这是 RavenDB 不太适合的一件事(http://ravendb.net/docs/server/bundles/index-replication)。您的问题类似于 SQL Server Analysis Services 中多维数据集的结构。
这种情况下的问题是日期范围。如果范围是固定的,比如我想知道每个月的情况,您可以在索引中执行此操作,但如果范围是临时的,那么我相信在 Raven 中使用索引是不可能的,而且可能甚至不可能一个查询,因为您必须在客户端进行分组,因此必须检索大量文档(远远超过 Raven 的默认值 128)。
但是,如果有人在我们省略日期范围的索引中按示例搜索多个组,那么遵循索引实现,其中结果按用户 ID、位置和事件类型分组可能是一种解决方案:
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
然后,您可以查询该索引并对查询结果进行额外分组。