我还在学习,所以也许我的模型目前是错的,但这是我到目前为止所做的:
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()
};
}
}
答案 0 :(得分:1)
RavenDB无法在单个文档的项目中进行分页,因为它将doc视为聚合。因此,您可以页面填写完整文档(使用Skip / Take),而不是单个帐户文档中的关注者。
因此,您必须使用2个数据库调用,一个用于获取帐户,1个用于查询关注者如何关注该帐户。
但是,如果您使用RavenDB的延迟请求功能,则可以节省网络往返次数。有关详细信息,请参阅here和here。
var lazyUser = session.Advanced.Lazily.Load<User>("users/ayende");
var lazyPosts = session.Query<Posts>().Take(30).Lazily();
另外要记住的是,您希望单个帐户拥有多少粉丝?如果它数量很大,你可能会遇到存储文件,存储RavenDB中的大文件。反序列化非常大的文档的开销可能会成为一个问题。