返回用户以及分页的粉丝集合

时间:2012-01-26 18:12:10

标签: indexing ravendb

我还在学习,所以也许我的模型目前是错的,但这是我到目前为止所做的:

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 个答案:

答案 0 :(得分:1)

RavenDB无法在单个文档的项目中进行分页,因为它将doc视为聚合。因此,您可以页面填写完整文档(使用Skip / Take),而不是单个帐户文档中的关注者。

因此,您必须使用2个数据库调用,一个用于获取帐户,1个用于查询关注者如何关注该帐户。

但是,如果您使用RavenDB的延迟请求功能,则可以节省网络往返次数。有关详细信息,请参阅herehere

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

另外要记住的是,您希望单个帐户拥有多少粉丝?如果它数量很大,你可能会遇到存储文件,存储RavenDB中的大文件。反序列化非常大的文档的开销可能会成为一个问题。