RavenDb Возврат только проиндексированных полей - PullRequest
4 голосов
/ 25 января 2012

Давайте представим, что у меня есть следующий индекс:

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. Преобразование индекса карты в индекс MapReduce путем введения некоторой фальшивой части Reduce (равной Map), которая фактически ничего не уменьшит.Это выглядит как лучшее решение, но раздражает реализация этой фальшивой части Reduce.

Так почему нет более естественного решения для этого (или, может быть, я просто не знаю об этом)?Это концептуальное решение?

1 Ответ

2 голосов
/ 26 января 2012

Вы можете использовать функцию Проекции RavenDB для преобразования.

Это просто меняет форму документа Json после того, как RavenDB извлек его из хранилища документов, поэтому поля не должны быть помечены как 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();

Чаще всего он используется для разрешения объединений, см. в этом блоге для получения дополнительной информации, но он работает и в этом сценарии.

...