/ / RavenDb Retorna apenas campos indexados - .net, nosql, ravendb

RavenDb Retorna apenas campos indexados - .net, nosql, ravendb

Vamos imaginar que eu tenho o seguinte índice:

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

Se eu o executar, o RavenDb retornará não apenas Id, Title e CommentsCount, mas todo o documento Post. Mas eu não preciso de todo o documento (imagine que ele contém muitas outras coisas).

Como eu não sei, existem duas soluções agora:

  1. Marcar campos de índice como Armazenados e chamados AsProjection para a consulta. Eu não gosto esta solução pelo desempenho e motivos de consumo de espaço em disco extra. É mais como solução alternativa do que solução.
  2. Converter o índice do mapa no índice MapReduce porintrodução de alguma parte Reduce falsa (igual ao Map) que na verdade não vai reduzir nada. Parece uma solução melhor, mas É chato implementar essa parte Reduce falsa.

Então, por que não há solução mais natural para isso (ou pode ser que eu simplesmente não sei) É uma solução conceitual?

Respostas:

2 para resposta № 1

Você pode usar o Recurso de projeções de RavenDB para fazer a conversão.

Isso apenas muda a forma do documento do Json depois que o RavenDB o extraiu do repositório de documentos, para que os campos não precisem ser marcados como Stored para que funcione

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

Você ainda precisa de nós .As<new type> quando você consulta este índice, caso contrário o RavenDB irá reclamar. Algo assim:

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

É mais comumente usado para permitir junções, veja este post de blog para mais informações, mas também funciona neste cenário.