Вернуть пользователя вместе с постраничной коллекцией подписчиков - PullRequest
0 голосов
/ 26 января 2012

Я все еще учусь, так что, возможно, моя модель в настоящее время неверна, но это то, что у меня есть:

Account
{
 string Id,
 string ArtistName,
 List<FollowerAccount> Followers
}

FollowerAccount
{
 AccountId,
 DateBeganFollowing
}

Таким образом, документ моей Учетной записи содержит список денормализованных ссылок на список всех учетных записей, которые следуют за ними.

Теперь я хочу вернуть список учетных записей из списка подписчиков 'accounts / 1', но разместив их на странице, я знаю, что могу сделать это как 2 запроса, но я надеялся, что смогу зафиксировать этот запрос 2 1.

Вот индекс, с которым я играюсь, однако я не могу заставить его работать.

public class TestIndex : AbstractMultiMapIndexCreationTask<TestIndex.ReduceResult>
    {
        public class ReduceResult
        {
            public string AccountId { get; set; }
            public DateTimeOffset? DateBecameFollower { get; set; }
            public string ParentAccountId { get; set; }
            public string ArtistName { get; set; }
        }

        public TestIndex()
        {
            AddMap<Account>(followers => from follower in followers
                                         from sub in follower.FollowersAccounts
                              select new
                              {
                                  ParentAccountId = follower.Id,
                                  AccountId = sub.AccountId,
                                  DateBecameFollower = sub.DataBecameFollower,
                                  ArtistName = (string)null
                              });

            AddMap<Account>(accounts => from account in accounts
                                        select new
                                        {
                                            ParentAccountId = (string)null,
                                            AccountId = account.Id,
                                            DateBecameFollower = DateTimeOffset.MinValue,
                                            ArtistName = account.ArtistName,
                                        });

            Reduce = results => from result in results
                                group result by result.AccountId
                                    into g
                                    select new
                                    {
                                        ParentAccountId = g.Select(x => x.ParentAccountId).Where(x => x != null).First(),
                                        AccountId = g.Key,
                                        DateBecameFollower = g.Select(x => x.DateBecameFollower).Where(x => x != DateTimeOffset.MinValue).First(),
                                        ArtistName = g.Select(x => x.ArtistName).Where(x => x != null).First()
                                    };
        }
    }

1 Ответ

1 голос
/ 27 января 2012

RavenDB не может создавать страницы в элементах одного документа, потому что он обрабатывает документ как совокупность.Таким образом, вы можете заполнить страницы документов (используя Skip / Take), но не подписчиков внутри одного документа учетной записи.

Так что вам придется прибегнуть к 2 вызовам базы данных, один для полученияУчетная запись и 1, чтобы запросить Последователей, как они следуют за этой учетной записью.

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

var lazyUser = session.Advanced.Lazily.Load<User>("users/ayende");
var lazyPosts = session.Query<Posts>().Take(30).Lazily();

Еще один момент, о котором следует помнить, сколько подписчиков вы ожидаете иметь на одном аккаунте?Если это большая сумма, вы можете столкнуться с проблемой хранения больших документов в RavenDB.Затраты на десериализацию очень больших документов могут стать проблемой.

...