使用.NET客户端的RavenDB Map Reduce示例
我正在寻找一个如何在RavenDB.NET客户端中实现和使用MapReduce的示例 我想把它应用到一个特定的场景中:生成唯一的和总的访问者数量 将存储在RavenDB中的示例文档:使用.NET客户端的RavenDB Map Reduce示例,.net,mapreduce,ravendb,.net,Mapreduce,Ravendb,我正在寻找一个如何在RavenDB.NET客户端中实现和使用MapReduce的示例 我想把它应用到一个特定的场景中:生成唯一的和总的访问者数量 将存储在RavenDB中的示例文档: public class StatisticsEntry { public string Id { get; set; } public string UserId { get; set; } } 我可以找出如何使用Map创建标准索引,但我不知道如何实际使用Reduce函数,然后检索结果 不幸的是
public class StatisticsEntry
{
public string Id { get; set; }
public string UserId { get; set; }
}
我可以找出如何使用Map创建标准索引,但我不知道如何实际使用Reduce函数,然后检索结果
不幸的是,没有解释发生了什么,因此我可以理解如何通过.NET API使用它,而示例似乎根本没有使用.NET API实现这一点 以下是如何为独特访客建立索引:
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) };
}
}
公共类统计信息\u唯一访问者:AbstractIndexCreationTask
{
公众统计数字(唯一访客)
{
Map=entries=>from条目中的条目
选择新的{entry.UserId,Count=1};
Reduce=results=>from result in results
按result.UserId将结果分组到g中
选择新的{UserId=g.Key,Count=g.Sum(x=>x.Count)};
}
}
然后,您可以使用以下方法查询:
var numberOfUniqueVisitors = s.Query<StatisticEntry, Statistics_UniqueVisitors>().Count();
var numberOfUniqueVisitors=s.Query().Count();
对于访客总数,您可以使用:
var numberOfVisitors = s.Query<StatisticEntry>().Count();
var numberOfVisitors=s.Query().Count();
map reduce索引只是表示“我想做一个分组依据”的另一种方式,只有分组依据是预先定义的,RavenDB将在后台以高效的方式处理它,因此在查询时,您正在查找预先计算的结果
将以下内容视为一个普通组的答案(针对唯一用户)
忽略所创建数组的实际内容,我们可以通过请求
results.Length
如你所料
在RavenDB中,将此函数拆分为Map和Reduce,最终得到
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)
};
}
}
公共类唯一访问者结果
{
公共字符串用户标识{get;set;}
公共整数计数{get;set;}
}
公共类UniqueVisitorsIndex:AbstractIndexCreationTask
{
公共唯一访问者索引()
{
Map=docs=>来自文档中的文档
选择新的
{
UserId=doc.UserId,
计数=1
};
Reduce=results=>from result in results
按result.UserId将结果分组到g中
选择新的
{
UserId=g.Key,
Count=g.Sum(x=>x.Count)
};
}
}
本质上,这与上面的相同-但您已将其转换为MapReduce函数;-)
session.Query().Count();
将为您提供唯一访问者的总数,假设Count已在LINQ提供程序中正确实现(我认为iirc已实现)
条目总数仅为
session.Query<StatisticEntry>().Count();
session.Query().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
};
}
}
公共类UniqueVisitorsIndex:AbstractIndexCreationTask
{
公共唯一访问者索引()
{
Map=docs=>来自文档中的文档
选择新的
{
UserId=doc.UserId
};
Reduce=results=>from result in results
按result.UserId将结果分组到g中
选择新的
{
UserId=g.Key
};
}
}
您希望实现什么目标?你想以任何方式使用日期时间吗?(每天、每月、每年之类的事?)现在不行。我以后可能会使用此字段创建其他索引。目前,我将从类中删除它以简化。至于“想要实现”-我想生成统计数据,显示a)统计条目的总数和b)唯一用户。好的-因为在这种情况下,每个“分组”需要一个映射/减少索引-答案马上就出来。感谢您的解释。在第一个示例中,您提供了Count=g.Sum(x=>x.Count)
-这给了我一个编译错误,因为x
属于StatisticsEntry
-这应该来自哪里?哦,定义一个输出形状,让我修改示例:)以及安装此索引的键<代码>Raven.Client.index.IndexCreation.CreateIndexes(typeof(UniqueVisitorsIndex).Assembly,documentStore)代码>--我花了一点时间才找到那个“哦,定义输出形状”是什么意思?你能举一个统计条目的例子吗?第一个例子中的docs是docs中的doc模型吗?
session.Query<StatisticEntry>().Count();
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
};
}
}