У меня есть следующий объект 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, когда оба индекса запрашивают один и тот же документ ... Есть ли другие решения?