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函數的結果相同。那麼我怎麼寫出正確的地圖/縮小功能呢?
但是,將UniqueVisitorId添加到UniqueVisitorByDate類看起來很奇怪,有沒有更好的解決方案? –
不是我所知道的。您可以將該屬性的名稱更改爲類似'TempId_DO_NOT_USE'的名稱,以表明它不應該在您的應用程序中使用。 – Simon
@DylanLin'UniqueVisitorId'必須是'UniqueVisitorByDate'的一部分,因爲Map和Reduce必須產生相同形狀的對象。 –