2

MapReduce を削減したい状況に陥ることがよくあります。たとえば、1 つのオブジェクトからバージョンを取得し、別のオブジェクトからカウントを取得する 2 つのオブジェクトがあるとします。

public class Visit {
    public string Id { get; set; }
    public string Version { get; set; }
}

public class Search {
    public string Id { get; set; }
    public string VisitId { get; set; }
}

public class MapReduceResult {
    public string VisitId { get; set; }
    public string Version { get; set; }
    public int Count { get; set; }
}

削減する場合、バージョンごとの検索数を取得できるように、Visit と Search を ID とバージョンでグループ化する必要があります。残念ながら、1 回の訪問ごとに 1 つの行が存在し、何百万もの訪問があることになります。したがって、データをクライアント側にプルすることは推奨される方法ではありません。また、1024 個のオブジェクト制限もそれを混乱させます。

この問題は、どうにかして MapReduce を再度削減できれば解決します。次に、VisitId を完全に無視して、2 回目はバージョン別にグループ化し、すべてのカウントを合計します。これを行う方法はありますか?

Sum でさえクエリ可能なものでは機能しないため、サーバー側のオプションが不足しているように感じます。

皆さんは何か考えがありますか、私はまったく意味がありますか?

4

1 に答える 1

0

RavenDB のリリース 2.0 以降、関連ドキュメントをインデックス化できる新しい機能が追加されました。

http://ravendb.net/docs/2.0/client-api/querying/static-indexes/indexing-related-documents

あなたの場合、インデックスは次のようになります。

public class Index : AbstractIndexCreationTask<Search, Index.Result>
{
    public class Result
    {
        public string Version { get; set; }
        public int Count { get; set; }
    }

    public Index()
    {
        Map = searches => from search in searches
                          let visit = LoadDocument<Visit>(search.VisitId)
                          select new Result
                                     {
                                         Version = visit.Version,
                                         Count = 1
                                     };

        Reduce = results => from result in results
                            group result by result.Version
                            into g
                            select new Result
                                       {
                                           Version = g.Key,
                                           Count = g.Sum(x => x.Count)
                                       };
    }
}
于 2013-02-27T12:36:04.440 に答える