单独的文档与地图/减少

时间:2013-04-10 21:08:08

标签: c# mapreduce ravendb

鉴于以下实体

public class Device
{
    public string Id { get; set; }
}

public class User
{
    public string Id { get; set; }

    public IList<Device> Devices { get; set; }
}

我需要通过id查询设备。设备ID是唯一的。设备始终属于一个用户。

我是否应该将设备存储为单独的文档,或者是地图缩减功能是否超出用户“好”?我需要经常访问某个特定设备(中间可能有缓存但仍然存在)?

任何提示或建议或最佳做法?

1 个答案:

答案 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));