示例使用.NET客户端RavenDB的map-reduce
题
在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();
不隶属于 StackOverflow