尽管您可以从索引中的其他文档“使用LoadDocument”“包含”属性,但由于需要更频繁地重建索引,因此不建议广泛使用它。
在你的情况下,你可以建立你的歌曲文档的模型,以包含id和查询引用艺术家,流派等,然后使用变换器将结果转换为所需的“视图模型”。在变换器中使用LoadDocument来获取艺术家姓名,流派名称等并返回转换后的结果。转换是根据请求在服务器端执行的。
你的歌声实体(简体)可能是这样的:
public class Song
{
public string Id { get; set; }
public string Name { get; set; }
public string ArtistId { get; set; }
}
而且像这样的指标:一个变压器相结合
public class Song_ByArtist : AbstractIndexCreationTask<Song>
{
public Song_ByArtist()
{
Map = songs => from song in songs
select new
{
song.Name,
song.ArtistId
};
}
}
:
public class Song_Artist_Transformer : AbstractTransformerCreationTask<Song>
{
public Song_Artist_Transformer()
{
TransformResults = results => from song in results
let artist = LoadDocument<Artist>(song.ArtistId)
select new SongArtistViewModel
{
SongName = song.Name,
ArtistName = artist.Name
};
}
}
您可以查询为艺术家提供歌曲并返回包含艺术家姓名的视图模型:
using (var session = _documentStore.OpenSession())
{
var results = session.Query<Song, Song_ByArtist>()
.Where(x => x.ArtistId == "artists/1")
.TransformWith<Song_Artist_Transformer, SongArtistViewModel>();
}
这将返回所有转换为歌曲名称和艺术家姓名的视图模型的艺术家“artists/1”的歌曲。
因此,底线是:模拟您的歌曲文档,以便在需要时包含对其他文档的引用(如果遵循DDD,则为聚合),然后包含使用变形金刚所需的信息。变形金刚可以看作有点像关系数据库中的“视图”。
注意:为您的歌曲文档制作一个组合索引,将索引所有属性(歌曲属性和引用),然后使用多个变换器根据需要呈现数据。对于相同的文档类型,每个文档使用一个“大”索引而不是几个小索引通常会更好。在这个例子中,我只映射了名称和艺术家ID以保持简单。
希望这会有所帮助!