gpt4 book ai didi

.net - 使用.NET Client的RavenDB Map-Reduce示例

转载 作者:行者123 更新时间:2023-12-03 08:07:23 24 4
gpt4 key购买 nike

我正在寻找一个如何在RavenDB .NET Client中实现和使用Map-Reduce的示例。

我想将其应用于特定情况:生成唯一的访问者总数。

样本文档将存储在RavenDB中:

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

我可以弄清楚如何使用Map创建标准索引,但是对于如何实际使用Reduce函数然后检索结果却一无所知。

不幸的是, example provided on the RavenDB Site并没有解释发生了什么,因此我可以理解如何通过.NET API使用它,并且这些示例似乎根本没有使用.NET API来实现。

最佳答案

映射归约索引只是“我想做一个分组依据”的另一种表达方式,只有分组分组是预先定义的,RavenDB会在后台以高效的方式对其进行处理,因此在查询时您正在查找预先计算的结果。

将以下内容视为普通用户的答案(针对唯一用户)

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

忽略创建的数组的实际内容,我们可以通过要求获得总结果
 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)
};
}
}

本质上,这与上面的相同-但您已将其变成MapReduce函数;-)
 session.Query<StatisticEntry, UniqueVisitorsIndex>().Count();

假设Count已在LINQ提供程序中正确实现(iirc我认为已实现),它将为您提供唯一身份访问者总数

条目总数很简单
 session.Query<StatisticEntry>().Count();

如您所愿(不需要 map /缩小)

注意:该索引还可以用于查看特定用户的点击次数,因为该计数是在索引中计算的,如果您不关心计数,则删除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
};
}
}

关于.net - 使用.NET Client的RavenDB Map-Reduce示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4253334/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com