C# 带排序的Map-Reduce索引

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

我们在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 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,
        };

排序时间不是问题。但是,请注意,您正在输出消息,如果消息很大,它将扩展索引。请注意,我们需要跟踪索引中的所有消息,以便计算最新消息。
跟踪频道和计数,并在单独的查询中加载每个频道的最新消息可能更容易。

在分组之前还是在选择中排序更好