【问题标题】:RavenDB MapReduce Reduce or aggregate MapReduce results serversideRavenDB MapReduce Reduce 或聚合 MapReduce 结果服务器端
【发布时间】:2013-02-27 20:36:04
【问题描述】:

我经常会遇到想要减少 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 都不能用于可查询,所以感觉就像我已经用完了服务器端选项。

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

【问题讨论】:

    标签: mapreduce ravendb aggregate


    【解决方案1】:

    自 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)
                                           };
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多