我正在努力用ravendb创建一个简单的索引。
鉴于两个文件集:
用户(34000个文档)和 BlogEntries(150万个文档)
1)如何创建一个显示每个用户的博客条目数的索引?
集合关系如下:
User.LastName +“,”+ User.FirstName = Blog.CreatedBy
重要的是,BlogEntries包含与用户集合无关的旧条目。我想过滤掉那些条目,以便它们不会出现在索引中。这就是我在这里需要用户集合的原因。
示例数据:
User Collection:
User U1
User U2
BlogEntry Collection:
BlogEntry B1 -> U1
BlogEntry B2 -> U1
BlogEntry B3 -> U2
BlogEntry B4 -> XYZ1
BlogEntry B5 -> XYZ2
BlogEntry B6 -> U1
我想过滤掉B4和B5条目,因为它们与用户集合中的用户无关。
2)我是否必须使用多图索引?
3)我已经通过管理工作室尝试了以下操作,但索引不起作用。 似乎我不能在一个地图块中使用两个文档集合。
地图:
from user in docs.Users
from blog in docs.Blogs
where blog.CreatedBy = user.LastName + "," + user.FirstName
select new { UserName = user.LastName ..., Count = 1 }
减少
from result in results group by result.UserName
into g
select new { User = g.Key, g.Sum( x => x.Count) }
谢谢, 的Marius
答案 0 :(得分:1)
根据需求的变化,我猜你需要一个多地图索引:
AddMap<User>(users => from user in users
select new
{
UserName = user.LastName + "," + user.FirstName,
HasUser = true,
Count = 0
});
AddMap<BlogEntry>(blogEntries => from blogEntry in blogEntries
select new
{
UserName = blogEntry.CreatedBy,
HasUser = false,
Count = 1
});
Reduce = results => from result in results
group result by result.UserName
into g
select new
{
UserName = g.Key,
HasUser = g.Any(x => x.HasUser),
Count = g.Sum(x => x.Count)
};
您可以按HasUser
属性过滤索引。