3

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 関数を書くことができるでしょうか?

4

1 に答える 1

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

マップの「reduce」および「count」プロパティに追加の「UniqueVisitorId」プロパティが必要ですが、これらは無視してかまいません。

于 2012-05-15T09:21:42.030 に答える