使用.NET客户端的RavenDB Map Reduce示例

使用.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函数,然后检索结果 不幸的是

我正在寻找一个如何在RavenDB.NET客户端中实现和使用MapReduce的示例

我想把它应用到一个特定的场景中:生成唯一的和总的访问者数量

将存储在RavenDB中的示例文档:

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