我正在玩Raven DB几天,我想将它用作我的网络聊天应用程序的存储空间。我的文档包含一些用户数据和聊天记录 - 这是大型的收集聊天消息。
每次加载用户文档时,即使我只需要几个字段,例如:用户名,密码和电子邮件,也会加载聊天记录。
我的问题是:如何只从数据库加载部分文档?
答案 0 :(得分:31)
托梅克,
您无法加载部分文档,但可以加载投影。
session.Query<User>()
.Where(x=>x.Name == name)
.Select( x=> new { x.Name, x.Email });
这将只加载适当的字段
答案 1 :(得分:4)
从我看到你可以做到这一点(基于上面的原始“用户”场景):
public class UserSummary
{
public string Name { get; set; }
public string Email { get; set; }
}
然后你可以这样做:
documentSession.Query<User>().AsProjection<UserSummary>();
查看Raven服务器,它将其作为查询的一部分吐出:
?query=&pageSize=128&fetch=Name&fetch=Email&fetch=Id
所以看起来它只是查询并只返回原始对象的一个子集,这很好。
这也有效:
documentSession.Query<User>().Select( x=> new User { Name = x.Name, Email= x.Email })
但我认为这不像返回UserSummary对象一样干净。
对已发布回复的人员提出了一些跟进问题:
RaccoonBlog的链接就是这个例子:
该方法是否优于.AsProjection()?这两种方法有什么区别?
答案 2 :(得分:2)
Tomek,您无法仅加载文档的一部分。
但是,我理解你的问题。我建议为每个用户使用两个单独的文档:一个实际包含用户数据(名称,密码,电子邮件等),另一个包含所有用户消息。这样,加载用户的所有消息以及为一般用途加载用户列表仍然非常便宜。
这实际上非常类似于博客域的模型,您有帖子和帖子评论。看看RaccoonBlog,了解其工作原理。