乌鸦DB:如何创建"按日期&QUOT UniqueVisitorCount;指数 [英] Raven DB: How to create "UniqueVisitorCount by date" index

查看:220
本文介绍了乌鸦DB:如何创建"按日期&QUOT UniqueVisitorCount;指数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



<预类=郎-CS prettyprint-覆盖> 公共类VisitSession {
公共字符串的SessionID {搞定;组; }
公共DateTime的开始时间{搞定;组; }
公共字符串UniqueVisitorId {搞定;组; }
公众的IList< PageVisit> PageVisits {搞定;组; }
}

当访问者去的网站,访问会话启动。一次访问会话有很多页面访问。跟踪器会写UniqueVisitorId(GUID)饼干时候,第一时间访问者进入网站。所以,我们可以知道,如果一个访问者回访者。



现在,我想知道有多少独立访问者在访问网站日期范围。这就是说,我想在我们的网页这样显示一个表格;

 日期|唯一访问者数
------------ + ------------
2012-05 -01 | 100
2012-05-02 | 1000
2012-05-03 | 120



我想创建一个索引RavenDB做到这一点。但我不知道怎么写的Map / Reduce查询。我虽然也可以是这样的:



<预类=郎-CS prettyprint-覆盖> 公共类UniqueVisitor_ByDate:AbstractIndexCreationTask< VisitSession,UniqueVisitorByDate>
{
公共UniqueVisitor_ByDate()
{
=地图会议= GT;从s会话中
选择新的
{
s.StartTime.Date,
s.UniqueVisitorId
};

=减少的结果=>从结果由result.Date结果
组的结果为G
选择新的
{
日期= g.Key,
UniqueVisitorCount = g.Distinct()
};
}
}



但它不工作。在Ayende的电子书,我知道Map函数的结果应该是一样的Reduce函数的结果。 ?所以,我怎么能写正确的map / reduce功能


解决方案

这个指标应该做你想要什么:

 公共类UniqueVisitor_ByDate:AbstractIndexCreationTask< VisitSession,UniqueVisitorByDate> 
{
公共UniqueVisitor_ByDate()
{
=地图会议= GT;从s会话中
选择新的
{
s.StartTime.Date,
s.UniqueVisitorId,
计数= 1,
};

=减少的结果=>从结果由result.Date
为G
结果
组的结果选择新UniqueVisitorByDate
{
日期= g.Key,
计数= G。选择(X => x.UniqueVisitorId).Distinct()COUNT(),
UniqueVisitorId = g.FirstOrDefault()UniqueVisitorId,
}。
}
}

请注意,它需要额外的UniqueVisitorId属性在减少,并在地图中的计数属性,但你可以忽略这些。


I have an application to track the page visits for a website. Here's my model:

public class VisitSession {
    public string SessionId { get; set; }
    public DateTime StartTime { get; set; }
    public string UniqueVisitorId { get; set; }
    public IList<PageVisit> PageVisits { get; set; }
}

When a visitor go to the website, a visit session starts. One visit session has many page visits. The tracker will write a UniqueVisitorId (GUID) cookie when the first time a visitor go to the website. So we are able to know if a visitor is returning visitor.

Now, I want to know how many unique visitors visited the website in a date range. That is, I want to display a table in our webpage like this;

Date        | Unique Visitors Count
------------+-----------------------
2012-05-01  | 100
2012-05-02  | 1000
2012-05-03  | 120

I want to create an index to do this in RavenDB. But I don't know how to write the Map/Reduce query. I though it can be like this:

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

But it's not working. In Ayende's e-book, I know that the result of Map function should be same as the result of Reduce function. So how can I write the correct map/reduce functions?

解决方案

This index should do what you want:

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

Note that it requires the extra 'UniqueVisitorId' property in the 'reduce' and the 'count' property in the map, but you can just ignore those.

这篇关于乌鸦DB:如何创建&QUOT;按日期&QUOT UniqueVisitorCount;指数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆