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 を書き込みます。そのため、訪問者が再訪問者であるかどうかを知ることができます。
ここで、特定の日付範囲内に Web サイトを訪問したユニーク ビジターの数を知りたいと考えています。つまり、次のように Web ページにテーブルを表示したいと考えています。
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 関数を書くことができるでしょうか?