RavenDB - 检索部分文档

时间:2011-10-19 23:19:31

标签: ravendb

我正在玩Raven DB几天,我想将它用作我的网络聊天应用程序的存储空间。我的文档包含一些用户数据和聊天记录 - 这是大型的收集聊天消息。

每次加载用户文档时,即使我只需要几个字段,例如:用户名,密码和电子邮件,也会加载聊天记录。

我的问题是:如何只从数据库加载部分文档?

3 个答案:

答案 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的链接就是这个例子:

https://github.com/ayende/RaccoonBlog/blob/master/RaccoonBlog.Web/Infrastructure/Indexes/PostComments_CreationDate.cs

该方法是否优于.AsProjection()?这两种方法有什么区别?

答案 2 :(得分:2)

Tomek,您无法仅加载文档的一部分。

但是,我理解你的问题。我建议为每个用户使用两个单独的文档:一个实际包含用户数据(名称,密码,电子邮件等),另一个包含所有用户消息。这样,加载用户的所有消息以及为一般用途加载用户列表仍然非常便宜。

这实际上非常类似于博客域的模型,您有帖子和帖子评论。看看RaccoonBlog,了解其工作原理。