我正在查看RacoonBlog的源代码,试图在RavenDB中找到一种方法来查询文档中包含的集合。我读过有关索引和Map / Reduce的内容,但未能找到答案。
在PostsController中有一个名为Tag的ActionResult,它接受一个字符串参数并包含以下linq查询。
var posts = RavenSession.Query<Post>()
.Include(x => x.AuthorId)
.Statistics(out stats)
.WhereIsPublicPost()
.Where(post => post.TagsAsSlugs.Any(postTag => postTag == slug))
.OrderByDescending(post => post.PublishAt)
.Paging(CurrentPage, DefaultPage, PageSize)
.ToList();
Where扩展方法调用TagsAsSlugs并执行Any,TagsAsSlugs看起来像这样。
public IEnumerable<string> TagsAsSlugs
{
get
{
if (Tags == null)
yield break;
foreach (var tag in Tags)
{
yield return SlugConverter.TitleToSlug(tag);
}
}
}
因为TagsAsSlugs属性循环遍历标记集合,所以查询要求返回所有帖子,以便每个帖子可以迭代其Tags集合吗?
我怀疑是这种情况,因为Oren's blog如此之快。
答案 0 :(得分:1)
杰克逊 不,这不是它的工作原理。我们在索引期间完成工作(TagsAsSlugs实际上是在节省时间计算的),然后我们将TagsAsSlugs保存到索引中。 我们查询索引中存在的标记。
简而言之,我们不做任何计算,当然也不在客户端。