/ / RavenDb Zwraca tylko pola indeksowane - .net, nosql, ravendb

RavenDb Zwróć tylko indeksowane pola - .net, nosql, ravendb

Wyobraźmy sobie, że mam następujący indeks:

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,
};
}
}

Jeśli go wykonam, RavenDb zwróci nie tylko identyfikator, tytuł i komentarze, ale cały dokument Post. Ale nie potrzebuję całego dokumentu (wyobraźmy sobie, że zawiera wiele innych rzeczy).

Jak nie rozumiem, istnieją teraz dwa rozwiązania:

  1. Oznacz pola indeksu jako Zapisane i wywołaj AsProjection dla zapytania. Nie lubię to rozwiązanie ze względu na wydajność i dodatkowe zapotrzebowanie miejsca na dysku. To bardziej przypomina obejście niż rozwiązanie.
  2. Konwertuj indeks mapy na MapReduce indeks owprowadzenie fałszywej części Reduce (równej Mapie), która właściwie nic nie zmniejszy. Wygląda na lepsze rozwiązanie, ale tak jest jest denerwujące, aby wdrożyć tę fałszywą część Reduce.

Dlaczego więc nie ma na to naturalnego rozwiązania (a może po prostu nie wiem o tym)? Czy jest to rozwiązanie koncepcyjne?

Odpowiedzi:

2 dla odpowiedzi № 1

Możesz użyć Funkcja projekcji RavenDB, aby dokonać konwersji.

To tylko zmienia kształt dokumentu Jsona po tym, jak RavenDB wyciągnął go ze sklepu z dokumentami, więc pola nie muszą być oznaczone jako Stored aby działało

  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 };
}

Nadal potrzebujesz nas .As<new type> kiedy przeszukujesz ten indeks, w przeciwnym razie RavenDB będzie narzekać. Coś takiego:

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

Najczęściej używa się go do łączenia, patrz ten wpis na blogu aby uzyskać więcej informacji, ale działa również w tym scenariuszu.