RavenDb Multi-map/reduce 索引,以防没有共同 属性 分组依据
RavenDb Multi-map/reduce index in case of no common property to group by
我有以下文件:
public class Post
{
public string Id {get;set;}
public string BlogId {get;set;}
public string AuthorId {get;set;}
public string Content {get;set;}
}
public class Blog
{
public string Id {get;set;}
public string Language {get;set;}
}
我需要创建一个索引,以便我可以计算特定语言博客中每个用户的帖子数(所以我想过滤 Blog.Language 属性)。
首先我认为 multimap/reduce 索引是一个可行的方法:
AddMap<Post>((posts) => from post in posts
select new
{
UserId = post.AuthorId,
Count = 1,
Language = Language.None
});
AddMap<Blog>((blogs) => from blog in blogs
select new
{
UserId = null,
Count = 0,
Language = blog.Language
});
但是如您所见,博客中没有指定 UserId 属性,所以我认为我无法使 Reduce 部分工作(因为我打算减少 UserId 属性)。
据我了解,您不需要索引中的博客,而是它们的语言:
AddMap<Post>((posts) => from post in posts
select new
{
UserId = post.AuthorId,
Count = 1,
Language = LoadDocument<Blog>(post.BlogId).Language
});
然后减少 UserId
和 Language
:
Reduce = results => from result in results
group result by new { result.UserId, result.Language }
into g
select new {
UserId = g.Key.UserId,
Count = g.Sum(x => x.Count),
Language = g.Key.Language
};
我有以下文件:
public class Post
{
public string Id {get;set;}
public string BlogId {get;set;}
public string AuthorId {get;set;}
public string Content {get;set;}
}
public class Blog
{
public string Id {get;set;}
public string Language {get;set;}
}
我需要创建一个索引,以便我可以计算特定语言博客中每个用户的帖子数(所以我想过滤 Blog.Language 属性)。
首先我认为 multimap/reduce 索引是一个可行的方法:
AddMap<Post>((posts) => from post in posts
select new
{
UserId = post.AuthorId,
Count = 1,
Language = Language.None
});
AddMap<Blog>((blogs) => from blog in blogs
select new
{
UserId = null,
Count = 0,
Language = blog.Language
});
但是如您所见,博客中没有指定 UserId 属性,所以我认为我无法使 Reduce 部分工作(因为我打算减少 UserId 属性)。
据我了解,您不需要索引中的博客,而是它们的语言:
AddMap<Post>((posts) => from post in posts
select new
{
UserId = post.AuthorId,
Count = 1,
Language = LoadDocument<Blog>(post.BlogId).Language
});
然后减少 UserId
和 Language
:
Reduce = results => from result in results
group result by new { result.UserId, result.Language }
into g
select new {
UserId = g.Key.UserId,
Count = g.Sum(x => x.Count),
Language = g.Key.Language
};