【发布时间】:2013-02-21 22:58:55
【问题描述】:
使用 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 分组。
有没有更好的办法?
【问题讨论】:
-
犹大,这完全坏了。您似乎想在单个文档上执行此操作,但是因为您的 reduce 为 Id 返回 null,所以它们会混合在一起。
-
谢谢。我想我不明白在 reduce 中使用 null Id 的含义。