索引有两个集合

时间:2014-02-19 09:04:37

标签: ravendb ravendb-studio

我正在努力用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

1 个答案:

答案 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属性过滤索引。