2012-05-15 61 views
3

我有一個應用程序來跟蹤網站的頁面訪問。 這裏是我的模型:Raven DB:如何創建「UniqueVisitorCount by date」索引

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函數的結果相同。那麼我怎麼寫出正確的地圖/縮小功能呢?

回答

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

注意,它需要在「減少」,並在地圖中的「計數」屬性中的額外「UniqueVisitorId」屬性,但你可以不理會那些。

+0

但是,將UniqueVisitorId添加到UniqueVisitorByDate類看起來很奇怪,有沒有更好的解決方案? –

+0

不是我所知道的。您可以將該屬性的名稱更改爲類似'TempId_DO_NOT_USE'的名稱,以表明它不應該在您的應用程序中使用。 – Simon

+1

@DylanLin'UniqueVisitorId'必須是'UniqueVisitorByDate'的一部分,因爲Map和Reduce必須產生相同形狀的對象。 –