RavenDb仅返回索引字段

时间:2012-01-25 17:43:00

标签: .net nosql ravendb

让我们假设我有以下索引:

public class PostsForList: AbstractIndexCreationTask<Post, PostsForList.ReduceResult>
{
  public class ReduceResult
  {
    public string Id { get; set; }
    public string Title { get; set; }
    public long CommentsCount { get; set; }
  }

  public PostsForList()
  {
    Map = posts => from post in posts
                   select
                     new
                     {
                       Id = post.Id,
                       Title = post.Title,
                       CommentsCount = post.Comments,
                     };
  }
}

如果我执行它,RavenDb不仅会返回Id,Title和CommentsCount,还会返回整个Post文档。但我不需要整个文档(让我们想象它包含很多其他内容)。

正如我所说,现在有两种解决方案:

  1. 将索引字段标记为已存储并调用 AsProjection用于查询。我不喜欢 这个解决方案受性能和额外磁盘空间消耗的影响。 它更像是解决方法而不是解决方案。
  2. 通过引入一些假的Reduce部分(等于Map)将Map索引转换为MapReduce索引     实际上不会减少任何东西。它似乎是更好的解决方案,但它     很难实现这个假的Reduce部分。
  3. 那么为什么没有更自然的解决方案(或者我可能只是不知道它)?这是一个概念性的解决方案吗?

1 个答案:

答案 0 :(得分:2)

您可以使用RavenDB的Projections feature进行转换。

这只是在RavenDB将其从doc存储中拉出后改变了Json doc的形状,因此字段不必标记为Stored才能使其工作

  public PostsForList()
  {
    Map = posts => from post in posts
                   select
                     new
                     {
                       Id = post.Id,
                       Title = post.Title,
                       CommentsCount = post.Comments,
                     };
    TransformResults =
        (database, posts) => from post in posts                                 
                                 select new { post.Id, post.Title, post.CommentsCount };
  }

当您查询此索引时,您仍需要我们.As<new type>,否则RavenDB会抱怨。像这样:

session.Query<Post, PostTitleCommentsCount>()
   .Where(x => x.Title == "blah")
   .As<PostTitleCommentsCount>()
   .ToList();

它最常用于允许连接,有关详细信息,请参阅this blog post ,但也适用于此方案。