Индекс RavenDb MapReduce с тремя из случаев в Map - PullRequest
2 голосов
/ 24 января 2012

У меня есть следующий объект Post:

public class Post
{
   public string Id {get;set;}
   public string Text {get;set;}
   public IList<Vote> Votes {get;set;}
   public IList<Comment> Comments {get;set;}
}

Для списка сообщений мне нужно получить Id, Text, Rating (сумма голосов), CommentsCount. Я пытался создать следующий индекс MapReduce:

public class PostsForList: AbstractIndexCreationTask<Post, PostsForList.ReduceResult>
{
  public class ReduceResult
  {
    public string Id { get; set; }
    public string Text { get; set; }
    public long Rating { get; set; }
    public long CommentsCount { get; set; }
  }

  public PostsForList()
  {
    Map = posts => from post in posts
                              from comment in post.Comments
                              from vote in post.Votes
                              select
                                new
                                {
                                  Id = post.Id,
                                  Text = post.Text,
                                  Rating = vote.Value /* 1 or -1 */
                                  CommentsCount = 1,
                                };

    Reduce = results => from result in results
                        group result by result.Id
                        into grouped
                        select
                          new
                          {
                            Id = grouped.Key,
                            Text = grouped.Select(x => x.Text).First(),
                            Rating = grouped.Sum(x => x.Rating)
                            CommentsCount = grouped.Sum(x => x.Rating),
                          };
  }
}

Сначала это выглядело разумно. Но похоже, что моя Карта с тремя пунктами не будет работать. Единственное другое решение, которое я вижу, - это использование индекса MultiMap с двумя картами (одна для голосов, другая для комментариев). Но выглядит несколько странным использование индекса MultiMap, когда оба индекса запрашивают один и тот же документ ... Есть ли другие решения?

1 Ответ

3 голосов
/ 24 января 2012

Идса, здесь нет необходимости определять индекс.Обе коллекции Votes и Comments являются частью документа, поэтому просто используйте их:

var posts = documentSession.Query<Post>()
    .Skip(CurrentPage*PageSize)
    .Take(PageSize)
    .ToList(); // here is the db-call! all following is just in-memory

var viewModelPosts = from post in posts
                        select new
                            {
                                post.Id,
                                post.Text,
                                Rating = post.Votes.Sum(x => x.Value),
                                CommentsCount = post.Comments.Count
                            };

Обновление : я действительно хочу предварительно вычислитьрезультаты смотрите здесь: http://daniellang.net/using-an-index-as-a-materialized-view-in-ravendb/

...