.NETクライアントを使用したRavendB Map-Reduceの例
質問
Ravendb .NETクライアント内でMap-Reduceを実装および使用する方法の例を探しています。
特定のシナリオに適用したいと思います。ユニークで合計訪問者数を生成します。
Ravendb内に保存されるサンプルドキュメント:
public class StatisticsEntry
{
public string Id { get; set; }
public string UserId { get; set; }
}
MAPを使用して標準インデックスを作成する方法を把握することができますが、実際に還元関数を使用し、結果を取得する方法について迷子になりました。
残念ながら、 RavendBサイトで提供されている例 .NET APIを介してそれを使用する方法を理解できるように、何が起こっているのかを説明しません。サンプルは、.NET APIを使用してこれをまったく実装していないようです。
解決
マップ削減インデックスは「私はグループをやりたい」と言うもう一つの方法です。グループだけが事前に定義されています。RavendBはバックグラウンドで効率的な方法で処理します。事前に計算された結果。
(一意のユーザー向け)による普通グループとしての答えとして、以下を考慮してください
var results = from doc in docs
group doc by doc.UserId into g
select new
{
g.UserId,
g.Count()
}
作成された配列の実際の内容を無視すると、要求することで合計結果を得ることができます
results.Length
ご想像のとおり。
RavendBでは、この関数をマップと削減に分割し、最終的に
public class UniqueVisitorsResult
{
public string UserId { get; set; }
public int Count { get; set; }
}
public class UniqueVisitorsIndex : AbstractIndexCreationTask<StatisticsEntry, UniqueVisitorsResult>
{
public UniqueVisitorsIndex ()
{
Map = docs=> from doc in docs
select new
{
UserId = doc.UserId,
Count = 1
};
Reduce = results => from result in results
group result by result.UserId into g
select new
{
UserId = g.Key,
Count = g.Sum(x=>x.Count)
};
}
}
本質的に、これは上記と同じです - しかし、あなたはそれをmapReduce関数に変えました;-)
session.Query<StatisticEntry, UniqueVisitorsIndex>().Count();
LINQプロバイダーにカウントが適切に実装されていると仮定して、ユニークな訪問者の総数を提供します(IIRCは持っていると思います)
エントリの総数は単純です
session.Query<StatisticEntry>().Count();
ご想像のとおり(マップ/削減は必要ありません)
注:このインデックスは、インデックスでカウントが計算されているため、特定のユーザーによるヒット数を確認するためにも使用できます。
public class UniqueVisitorsIndex : AbstractIndexCreationTask<StatisticsEntry>
{
public UniqueVisitorsIndex ()
{
Map = docs=> from doc in docs
select new
{
UserId = doc.UserId
};
Reduce = results => from result in results
group result by result.UserId into g
select new
{
UserId = g.Key
};
}
}
他のヒント
ユニークな訪問者のインデックスを構築する方法は次のとおりです。
public class Statistics_UniqueVisitors : AbstractIndexCreationTask<StatisticsEntry>
{
public Statistics_UniqueVisitors()
{
Map = entries => from entry in entries
select new { entry.UserId, Count = 1 };
Reduce = results => from result in results
group result by result.UserId into g
select new { UserId = g.Key, Count = g.Sum(x=>x.Count) };
}
}
その後、以下を使用してこれを照会できます。
var numberOfUniqueVisitors = s.Query<StatisticEntry, Statistics_UniqueVisitors>().Count();
訪問者の合計カウントについては、以下を使用できます。
var numberOfVisitors = s.Query<StatisticEntry>().Count();