加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

.net – RavenDb仅返回索引字段

发布时间:2020-12-13 13:28:10 所属栏目:百科 来源:网络整理
导读:我们假设我有以下索引: public class PostsForList: AbstractIndexCreationTaskPost,PostsForList.ReduceResult{ public class ReduceResult { public string Id { get; set; } public string Title { get; set; } public long CommentsCount { get; set; }
我们假设我有以下索引:

public class PostsForList: AbstractIndexCreationTask<Post,PostsForList.ReduceResult>
{
  public class ReduceResult
  {
    public string Id { get; set; }
    public string Title { get; set; }
    public long CommentsCount { get; set; }
  }

  public PostsForList()
  {
    Map = posts => from post in posts
                   select
                     new
                     {
                       Id = post.Id,Title = post.Title,CommentsCount = post.Comments,};
  }
}

如果我执行它,RavenDb将不仅返回Id,Title和CommentsCount,而且返回整个Post文档.但我不需要整个文档(让我们想象它包含很多其他东西).

正如我所说,现在有两种解决方案:

>将索引字段标记为已存储并调用
AsProjection用于查询.我不喜欢
这个解决方案受性能和额外磁盘空间消耗的影响.
它更像是解决方法而不是解决方案.
>通过引入一些假的Reduce部分(等于Map)将Map索引转换为MapReduce索引
????实际上不会减少任何东西.它似乎是更好的解决方案,但它
????很难实现这个假的Reduce部分.

那么为什么没有更自然的解决方案呢(或者我可能只是不知道它)?这是一个概念解决方案吗?

解决方法

您可以使用 Projections feature的RavenDB进行转换.

这只是在RavenDB将其从doc存储中拉出后改变了Json doc的形状,因此字段不必标记为Stored for it to working

public PostsForList()
  {
    Map = posts => from post in posts
                   select
                     new
                     {
                       Id = post.Id,};
    TransformResults =
        (database,posts) => from post in posts                                 
                                 select new { post.Id,post.Title,post.CommentsCount };
  }

你还需要我们.As< new type>当你查询这个索引时,否则RavenDB会抱怨.像这样的东西:

session.Query<Post,PostTitleCommentsCount>()
   .Where(x => x.Title == "blah")
   .As<PostTitleCommentsCount>()
   .ToList();

它最常用于允许连接,有关详细信息,请参阅this blog post ,但也适用于此方案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读