C# 带排序的Map-Reduce索引
我们在RavenDB中存储信息。 该类的简化版本如下所示C# 带排序的Map-Reduce索引,c#,performance,mapreduce,ravendb,C#,Performance,Mapreduce,Ravendb,我们在RavenDB中存储信息。 该类的简化版本如下所示 public class MessageInfo { public string Id { get; set; } public string ChannelId { get; set; } public Message Message { get; set; } } 现在,我们需要按通道id获取消息概述 public class MessageOverview { public string
public class MessageInfo
{
public string Id { get; set; }
public string ChannelId { get; set; }
public Message Message { get; set; }
}
现在,我们需要按通道id获取消息概述
public class MessageOverview
{
public string ChannelId { get; set; }
public int Count { get; set; }
public Message Message { get; set; }
}
并为此创建一个map reduce索引
public MessageOverviewIndex()
{
this.Map = messages => from m in messages select new { m.ChannelId, Count = 1, m.Message };
this.Reduce = results => from r in results
group r by r.ChannelId
into g
select new MessageOverview
{
ChannelId = g.Key,
Count = g.Sum(x => x.Count),
Message = g.OrderByDescending(m => m.Message.ServerTime).First().Message,
};
}
sort子句返回概述中的最新消息对性能的影响如何。
最好在ServerTime发送MessageInfo和/或MessageOverview,还是与此无关
还有其他/更好的方法吗
更新
这是当前的实施方式:
this.Map = messages => from m in messages
select new
{
m.Message.ChannelId,
Count = 1,
m.Message.ServerTime,
MessageId = m.Id
};
this.Reduce = results => from r in results
group r by r.ChannelId
into g
let t = g.OrderByDescending(x => x.ServerTime).First()
select new MessageOverview
{
ChannelId = g.Key.ChannelId,
Count = g.Sum(x => x.Count),
MessageId = t.MessageId,
ServerTime = t.ServerTime
};
最好是在索引中这样做,但是你可以这样做
results => from r in results
orderby r.Message.ServerTime descending
group r by r.ChannelId
into g
select new MessageOverview
{
ChannelId = g.Key,
Count = g.Sum(x => x.Count),
Message = g.First().Message,
};
排序时间不是问题。但是,请注意,您正在输出消息,如果消息很大,它将扩展索引。请注意,我们需要跟踪索引中的所有消息,以便计算最新消息。
跟踪频道和计数,并在单独的查询中加载每个频道的最新消息可能更容易。在分组之前还是在选择中排序更好