2

我经常会遇到想要减少 MapReduce 的情况。例如,如果我有两个对象,我想从一个对象获取版本,从另一个对象获取计数。

public class Visit {
    public string Id { get; set; }
    public string Version { get; set; }
}

public class Search {
    public string Id { get; set; }
    public string VisitId { get; set; }
}

public class MapReduceResult {
    public string VisitId { get; set; }
    public string Version { get; set; }
    public int Count { get; set; }
}

减少时,我必须按 ID 和版本将访问和搜索分组在一起,以便能够获得每个版本的搜索次数。不幸的是,每次访问都会有一行,我们正在谈论数百万次。因此,将数据拉到客户端不是首选方式,而且 1024 对象限制也有点搞砸了。

如果我能以某种方式再次减少 MapReduce,这个问题就会得到解决。然后我第二次按版本分组,完全忽略 VisitId,并总结所有计数。有没有办法做到这一点?

甚至 Sum 都不能用于可查询,所以感觉就像我已经用完了服务器端选项。

你们有什么想法,我有任何意义吗?

4

1 回答 1

0

自 RavenDB 2.0 版以来,添加了一项新功能,可让您索引相关文档:

http://ravendb.net/docs/2.0/client-api/querying/static-indexes/indexing-related-documents

在您的情况下,索引将如下所示:

public class Index : AbstractIndexCreationTask<Search, Index.Result>
{
    public class Result
    {
        public string Version { get; set; }
        public int Count { get; set; }
    }

    public Index()
    {
        Map = searches => from search in searches
                          let visit = LoadDocument<Visit>(search.VisitId)
                          select new Result
                                     {
                                         Version = visit.Version,
                                         Count = 1
                                     };

        Reduce = results => from result in results
                            group result by result.Version
                            into g
                            select new Result
                                       {
                                           Version = g.Key,
                                           Count = g.Sum(x => x.Count)
                                       };
    }
}
于 2013-02-27T12:36:04.440 回答