Webサイトのページ訪問を追跡するアプリケーションがあります。これが私のモデルです:
public class VisitSession {
public string SessionId { get; set; }
public DateTime StartTime { get; set; }
public string UniqueVisitorId { get; set; }
public IList<PageVisit> PageVisits { get; set; }
}
訪問者がWebサイトにアクセスすると、訪問セッションが開始されます。1回の訪問セッションには多くのページ訪問があります。トラッカーは、訪問者が初めてWebサイトにアクセスしたときに、UniqueVisitorId(GUID)Cookieを書き込みます。したがって、訪問者がリピーターであるかどうかを知ることができます。
ここで、毎日のTotalVisitSessions、TotalPageVisits、TotalUniqueVisitorsを表示するビューを作成します。だから私はこのマルチマップreduceを書きます:
public class VisitSummaryByDateIndex : AbstractMultiMapIndexCreationTask<VisitSummaryByDate>
{
public VisitSummaryByDateIndex()
{
AddMap<VisitSession>(sessions => from s in sessions
select new VisitSummaryByDate
{
Date = s.StartTime.Date,
TotalVisitSessions = 1,
TotalPageVisits = 0,
TotalNewVisitors = s.IsNewVisit ? 1 : 0,
TotalUniqueVisitors = 0,
UniqueVisitorId = s.UniqueVisitorId
});
AddMap<PageVisit>(visits => from v in visits
select new VisitSummaryByDate
{
Date = v.VisitTime.Date,
TotalVisitSessions = 0,
TotalPageVisits = 1,
TotalNewVisitors = 0,
TotalUniqueVisitors = 0,
UniqueVisitorId = String.Empty
});
Reduce = results => from result in results
group result by result.Date into g
select new VisitSummaryByDate
{
Date = g.Key,
TotalVisitSessions = g.Sum(it => it.TotalVisitSessions),
TotalPageVisits = g.Sum(it => it.TotalPageVisits),
TotalNewVisitors = g.Sum(it => it.TotalNewVisitors),
TotalUniqueVisitors = g.Select(it => it.UniqueVisitorId).Where(it => it.Length > 0).Distinct().Count(),
UniqueVisitorId = String.Empty
};
}
}
問題は「TotalUniqueVisitors」の計算にあり、インデックス結果のTotalUniqueVisitorsが1の場合もあれば、2の場合もあります。しかし、データを確認したところ、それほど少なくなることはありません。Map / Reduce構文に何か問題がありますか?
関連記事: Raven DB:「日付によるUniqueVisitorCount」インデックスの作成方法
サンプルデータを含むコードはここにあります: https ://gist.github.com/2702071