Raven DB:如何创建“按日期的UniqueVisitorCount”索引

时间:2012-05-15 09:00:06

标签: c# mapreduce ravendb

我有一个应用程序来跟踪网站的页面访问量。 这是我的模特:

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中创建一个索引来执行此操作。但我不知道如何编写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
                            };

        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函数呢?

1 个答案:

答案 0 :(得分:4)

这个索引可以做你想要的:

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'和'count'属性中的额外'UniqueVisitorId'属性,但您可以忽略它们。