デバイスを個別のドキュメントとして独自のコレクションに保存する場合、デバイスの ID がわかっているため、クエリを実行する必要はまったくありません。より高速な Load メソッドを使用できます。
それらを別々のドキュメントとして保存する場合は、削除と更新の一貫性について考える必要があります。たとえば、デバイスが削除された場合、このデバイスを持っていたすべてのユーザーも見つけて参照を削除する必要があります。
ユーザーに対して map-reduce インデックスを作成しても意味がありません。reduce 関数は map 関数の出力に対する group by と考えてください。map 関数と reduce 関数の出力の形状も同じでなければなりません。デバイスのインデックスを取得するには、何によってユーザーをグループ化しますか?
一方、それらをユーザーのみに保存する場合は、ユーザー インデックスにデバイス ID のフィールドを作成し、特定のデバイス ID を持つユーザーをクエリして、デバイスを取得することができます。ユーザー文書。
public class UsersIndex: AbstractIndexCreationTask<User>
{
public UsersIndex()
{
Map = docs=> from doc in docs
select new
{
DeviceIds = doc.Devices.Select(x => x.Id)
};
}
}
var device = DbSession.Advanced.LuceneQuery<User, UsersIndex>()
.WhereEquals("DeviceIds", 123)
.Select(x => x.Devices.SingleOrDefault(d => d.Id == 123));