RavenDBで単純平均を計算する正しい方法は何ですか?
私のオブジェクト:
class Song
{
public int CommunityRank { get; set; }
}
私の最初の素朴な考えは、「.Sum だけを使用する!」というものでしたが、パフォーマンス上の理由から Raven はそれを行わないという実行時エラーが発生しました。これは理にかなっています。
次に考えたのは、「それを計算する map/reduce インデックスを少し作ってみよう!」ということです。だから私はこれを思いついた:
public Songs_CommunityRankIndex()
{
Map = songs => from song in songs
select new
{
Id = song.Id, // # Hack? I only use this for grouping in the reduce.
SongCount = 1,
RankSum = song.CommunityRank
};
Reduce = results => from result in results
group result by result.Id into g
select new
{
Id = default(string),
SongCount = g.Sum(s => s.SongCount),
RankSum = g.Sum(s => s.RankSum)
};
}
...
// Now to calculate the average:
var communityRankStats = session
.Query<Song, Songs_CommunityRankIndex>()
.As<Songs_CommunityRankIndex.Results>()
.FirstOrDefault();
if (communityRankStats != null)
{
var averageSongRank = (double)communityRankStats.RankSum / communityRankStats.SongCount;
}
これは機能すると思いますが、グループ化するものが実際には何もないため、ハックのように感じます。そのため、曲 ID でグループ化しました。
もっと良い方法はありますか?