RavenDB - получение части документа - PullRequest
15 голосов
/ 20 октября 2011

Я играю с Raven DB в течение нескольких дней, и я хотел бы использовать его в качестве хранилища для моего приложения веб-чата.У меня есть документ, который содержит некоторые пользовательские данные и историю чата - это большие сообщения чата коллекции.

Каждый раз, когда я загружаю пользовательский документ, история чата также загружается, даже если мне нужны только несколько полей, таких как: имя пользователя, парольи электронная почта.

Мой вопрос: как загрузить только часть документа из базы данных?

Ответы [ 3 ]

31 голосов
/ 20 октября 2011

Tomek,

Вы не можете загрузить частичный документ, но вы можете загрузить проекцию.

session.Query<User>()
   .Where(x=>x.Name == name)
   .Select( x=> new { x.Name, x.Email });

Это загрузит только соответствующие поля

4 голосов
/ 09 мая 2013

Из того, что я видел, вы можете сделать это (основываясь на оригинальном сценарии «Пользователь» выше):

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 голосов
/ 20 октября 2011

Томек, вы не можете загрузить только часть документа.

Однако, я понимаю проблему в вашем случае.Я рекомендую использовать два отдельных документа для каждого пользователя: один, который фактически содержит данные о пользователях (имя, хеш-пароль, адрес электронной почты и т. Д.), И один, который содержит все сообщений пользователей.Таким образом, все еще очень дешево загружать все сообщения пользователя, а также загружать список пользователей для общих целей.

Это на самом деле очень похоже на то, как можно было бы моделировать блог-домен, гдеу вас есть пост и комментарии к постам.Взгляните на RaccoonBlog , чтобы увидеть, как это работает.

...