鉴于以下实体
public class Device
{
public string Id { get; set; }
}
public class User
{
public string Id { get; set; }
public IList<Device> Devices { get; set; }
}
我需要通过id查询设备。设备ID是唯一的。设备始终属于一个用户。
我是否应该将设备存储为单独的文档,或者是地图缩减功能是否超出用户“好”?我需要经常访问某个特定设备(中间可能有缓存但仍然存在)?
任何提示或建议或最佳做法?
答案 0 :(得分:1)
如果您将设备作为单独的文档存储在自己的集合中,那么您根本不需要查询,因为您知道它们的ID。你可以使用Load方法,它应该更快。
如果您将它们存储为单独的文档,则需要考虑删除和更新的一致性,例如:如果设备被删除,您需要确保您还找到拥有此设备的所有用户并删除引用。
对用户制作map-reduce索引没有意义。在map函数的输出中将reduce函数看作一个组。 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));