如果您将设备作为单独的文档存储在它们自己的集合中,则根本不需要查询,因为您知道它们的 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));