儘管您可以從索引中的其他文檔「使用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以保持簡單。
希望這會有所幫助!