代码之家  ›  专栏  ›  技术社区  ›  Alex Spence

RavenDb-按结果筛选分组的多映射索引

  •  3
  • Alex Spence  · 技术社区  · 12 年前

    我有一个要求,我需要得到一份按比赛日期排序的比赛列表。但我也需要把我的朋友们参加的比赛加在首位。因此,我正在努力维护一个指数,以记录我参加过每场比赛的朋友的数量。

    我有以下对象:

    public class Race {
        public string Id { get; set; }
        public string Name { get; set; }
        public string Distance { get; set; }
        public DateTime DateOfEvent { get; set; }
        public string Location { get; set; }
    
    }
        public class Runner {
        public string Id { get; set; }
        public string Name { get; set; }
        public DateTime DateOfBirth { get; set; }
        public string Hometown { get; set; }
    
        public List<string> Friends { get; set; }
        public List<string> RacesRun { get; set; }
    
    }
    

    到目前为止,这就是我对该指数的看法:

    public class RacesByFriends : AbstractMultiMapIndexCreationTask<RacesByFriends.ReduceResult> {
    
        public class ReduceResult {
            public string RunnerId { get; set; }
            public string RaceId { get; set; }
            public int Count { get; set; }
        }
    
        public RacesByFriends() {
    
            AddMap<Runner>(runners => from runner in runners
                                      from race in runner.RacesRun
                                      select new {
                                          RunnerId = runner.Id,
                                          RaceId = race,
                                          Count = 1,
                                      });
    
            AddMap<Race>(races => from race in races
                                  select new {
                                      RunnerId = (string)null,
                                      RaceId = race.Id,
                                      Count = 0,
                                  });
    
            Reduce = results => from result in results
                                group result by new {
                                    result.RunnerId,
                                    result.RaceId
                                } into g
                                select new {
                                    RunnerId = g.Select(x => x.RunnerId).FirstOrDefault(),
                                    RaceId = g.Select(x => x.RaceId).FirstOrDefault(),
                                    Count = g.Sum(x => x.Count)
                                };
    
        }
    }
    

    我的问题是,我如何使ReduceResult中的Count只反映参加过该比赛的人,并且存在于该跑步者朋友列表中。

    1 回复  |  直到 12 年前
        1
  •  1
  •   Alex Spence    12 年前

    我最终走上了一条不同的道路。Oren说你不能过滤源数据,这是有道理的。现在,我只需索引谁参加了什么比赛,并在查询中应用where in过滤器,然后按日期顺序对所有比赛进行排序,并从上一个查询中删除这些比赛。