RavenDB - получение части документа

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

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

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

Ответы

Ответ 1

Томек,

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

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

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

Ответ 2

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

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()? В чем разница между двумя подходами?

Ответ 3

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

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

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