在RavenDB .NET客户端内

我在寻找如何实现和使用一个例子的map-reduce。

我想将它应用到一个特定的场景:生成独特的旅客总计数。

这将被存储内RavenDB样品文件:

public class StatisticsEntry
{
    public string Id { get; set; }
    public string UserId { get; set; }
}

我可以找出如何创建使用地图标准的指数,但我失去了对如何实际使用Reduce函数,然后检索结果。

不幸的是,设在RavenDB网站的例如没有解释这是怎么回事等等我能理解如何通过.NET API使用它,并且样本似乎并不在所有使用.NET API来实现这一点。

有帮助吗?

解决方案

一个地图减少指数是说“我想要做一组由”的另一种方式,仅由该组是预定义的前面和RavenDB将处理它在后台以有效的方式,以便在查询时你正在寻找一个预先计算的结果。

考虑以下作为一个答案作为一个普通的GROUP BY(对于唯一的用户)

 var results = from doc in docs
 group doc by doc.UserId into g
 select new
 {
      g.UserId,
      g.Count()
 }

忽略所创建的阵列的实际内容,我们可以通过询问获取的总结果

 results.Length

如你所期望的。

在RavenDB,拆分出这个函数转换成一个地图和一个减少,并且你最终

public class UniqueVisitorsResult
{
     public string UserId { get; set; }
     public int Count { get; set; }
}

public class UniqueVisitorsIndex : AbstractIndexCreationTask<StatisticsEntry, UniqueVisitorsResult>
{
    public UniqueVisitorsIndex ()
    {
        Map = docs=> from doc in docs
                         select new 
                         { 
                             UserId = doc.UserId, 
                             Count = 1 
                         };
        Reduce = results => from result in results
                        group result by result.UserId into g
                        select new 
                        { 
                            UserId = g.Key, 
                            Count = g.Sum(x=>x.Count) 
                        };
    }
}

在本质上,这是与上述相同 - 但你把它变成了MapReduce的功能; - )

 session.Query<StatisticEntry, UniqueVisitorsIndex>().Count();

会给你的独立访问者总数,假定计数已在LINQ提供程序(IIRC我认为它有)

正确实施

条目的总数是简单地

 session.Query<StatisticEntry>().Count();

正如你所期望(没有地图/减少必需的)

请注意:该指标还可以使用特定的用户看到的点击次数,作为计数在指数进行计算,如果你不关心计数然后删除,MapReduce的一部分,做

public class UniqueVisitorsIndex : AbstractIndexCreationTask<StatisticsEntry>
{
    public UniqueVisitorsIndex ()
    {
        Map = docs=> from doc in docs
                     select new 
                     { 
                         UserId = doc.UserId
                     };
        Reduce = results => from result in results
                    group result by result.UserId into g
                    select new 
                    { 
                        UserId = g.Key
                    };
    }
}

其他提示

下面是你如何建立一个索引唯一访问者:

public class Statistics_UniqueVisitors : AbstractIndexCreationTask<StatisticsEntry>
{
    public Statistics_UniqueVisitors()
    {
        Map = entries => from entry in entries
                         select new { entry.UserId, Count = 1 };
        Reduce = results => from result in results
                            group result by result.UserId into g
                            select new { UserId = g.Key, Count = g.Sum(x=>x.Count) };
    }
}

可以然后查询这个使用:

var numberOfUniqueVisitors = s.Query<StatisticEntry, Statistics_UniqueVisitors>().Count();

有关访问者的总数,则可以使用:

var numberOfVisitors = s.Query<StatisticEntry>().Count();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top