我有一个应用程序来跟踪网站的页面访问量。这是我的模型:
public class VisitSession {
public string SessionId { get; set; }
public DateTime StartTime { get; set; }
public string UniqueVisitorId { get; set; }
public IList<PageVisit> PageVisits { get; set; }
}
当访问者访问网站时,访问会话将开始。一个访问会话具有多个页面访问。当访问者第一次访问网站时,跟踪器将写入一个UniqueVisitorId (GUID) cookie。因此,我们能够知道访客是否是回访者。
现在,我想知道在一个日期范围内有多少唯一身份访问者访问了该网站。也就是说,我想在我们的网页中显示一个这样的表格;
Date | Unique Visitors Count
------------+-----------------------
2012-05-01 | 100
2012-05-02 | 1000
2012-05-03 | 120
我想创建一个索引来在 RavenDB 中执行此操作。但是我不知道如何编写映射/减少查询。我虽然可以这样:
public class UniqueVisitor_ByDate : AbstractIndexCreationTask<VisitSession, UniqueVisitorByDate>
{
public UniqueVisitor_ByDate()
{
Map = sessions => from s in sessions
select new
{
s.StartTime.Date,
s.UniqueVisitorId
};
Reduce = results => from result in results
group result by result.Date into g
select new
{
Date = g.Key,
UniqueVisitorCount = g.Distinct()
};
}
}
但它不起作用。在Ayende的电子书中,我知道Map函数的结果应该与Reduce函数的结果相同。那么如何编写正确的map/reduce函数呢?
此索引应执行所需的操作:
public class UniqueVisitor_ByDate : AbstractIndexCreationTask<VisitSession, UniqueVisitorByDate>
{
public UniqueVisitor_ByDate()
{
Map = sessions =>
from s in sessions
select new {
s.StartTime.Date,
s.UniqueVisitorId,
Count = 1,
};
Reduce = results =>
from result in results
group result by result.Date
into g
select new UniqueVisitorByDate {
Date = g.Key,
Count = g.Select(x => x.UniqueVisitorId).Distinct().Count(),
UniqueVisitorId = g.FirstOrDefault().UniqueVisitorId,
};
}
}
请注意,它需要"reduce"中额外的"UniqueVisitorId"属性和地图中的"count"属性,但您可以忽略它们。