使用 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;
}
我认为这很有效,但感觉很hackish,因为真的没有什么可分组的,所以我只是按歌曲ID分组。
有没有更好的方法?