返回

ravendb——计算非规范化属性平均值的MR指数

发布时间:2022-02-22 08:48:26 610
# 数据# 信息

我有一个C#服务,定期响应客户请求执行一系列操作的请求,每个操作都存储在RavenDB操作文档中,带有这些属性,其中最后两个属性为性能而非规范化:

  • Id(字符串-PK)
  • 客户端ID(字符串FK)
  • RequestId(String——请求的唯一Id。我们不存储请求实体)
  • RequestDateTime(日期和时间-提出请求的日期和时间)
  • RequestDuration(时间跨度-请求确定操作列表所用的时间)

我想创建一个MR索引,提供每个客户端的每小时请求统计信息,以便查看客户端#1、01/02/22 09:00-10:00等的统计信息。我很难计算AvgRequestDuration,因为由于数据被反规范化,该组包含重复的RequestDuration。显然,min&;max不受重复项的影响。

public class Result
        {            
            public string ClientId { get; set; }
            public DateTime PeriodStart { get; set; }
            public TimeSpan MinRequestDuration { get; set; }
            public TimeSpan MaxRequestDuration { get; set; }
            public TimeSpan AvgRequestDuration { get; set; }
        }

        public ClientStatsByPeriodStartDateTime()
        {
            Map = action => from ac in actions
                                 let period = TimeSpan.FromHours(1)
                                 select new
                                 {                                                                    
                                     ClientId = ac.ClientId,
                                     PeriodStart = new DateTime(((ac.RequestDateTime.Ticks + period.Ticks - 1) / period.Ticks) * period.Ticks, DateTimeKind.Utc),
                                     ac.RequestDuration
                                 };

            Reduce = results => from result in results
                                group result by new
                                {                                    
                                    result.ClientId,
                                    result.PeriodStart
                                }

            into agg
                                select new
                                {
                                    ClientId = agg.Key.ClientId,
                                    PeriodStart = agg.Key.PeriodStart,
                                    AvgRequestDuration = agg.Avg(x => x.RequestDuration),   // This is wrong
                                    MinRequestDuration = agg.Min(x => x.RequestDuration),
                                    MaxRequestDuration = agg.Max(x => x.RequestDuration)
                                };
        }
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(1)
按点赞数排序
用户头像