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:
- 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.
- 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 № 1Você 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.