0

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

谢谢,马吕斯

4

1 回答 1

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您可以按属性过滤索引。

于 2014-02-19T09:22:28.013 回答