如何在RavenDB的索引上使用GroupBy?

时间:2019-02-05 22:13:16

标签: c# ravendb

我有这份文件,一个帖子:

{Content:“ blabla”,标签:[“ test”,“ toto”],创建日期:“ 2019-05-01 01:02:01”}

我希望有一个页面显示最近30天以来使用最多的标签。

到目前为止,我试图创建这样的索引

 public class Toss_TagPerDay : AbstractIndexCreationTask<TossEntity, TagByDayIndex>
{
    public Toss_TagPerDay()
    {

        Map = tosses => from toss in tosses
                        from tag in toss.Tags
                        select new TagByDayIndex()
                        {
                            Tag = tag,
                            CreatedOn = toss.CreatedOn.Date,
                            Count = 1
                        };
        Reduce = results => from result in results
                            group result by new { result.Tag, result.CreatedOn }
                            into g
                            select new TagByDayIndex()
                            {
                                Tag = g.Key.Tag,
                                CreatedOn = g.Key.CreatedOn,
                                Count = g.Sum(i => i.Count)
                            };
    }
}

我这样查询

 await _session
            .Query<TagByDayIndex, Toss_TagPerDay>()
            .Where(i => i.CreatedOn >= firstDay)
            .GroupBy(i => i.Tag)
            .OrderByDescending(g => g.Sum(i => i.Count))
            .Take(50)
            .Select(t => new BestTagsResult()
            {
                CountLastMonth = t.Count(),
                Tag = t.Key
            })
            .ToListAsync()

但这给了我错误

  

消息:System.NotSupportedException:无法理解表达式:从索引'Toss / TagPerDay'.Where(i =>(Convert(i.CreatedOn,DateTimeOffset)> = value(Toss.Server.Models.Tosses.BestTagsQueryHandler + < > c__DisplayClass3_0).firstDay))。GroupBy(i => i.Tag).OrderByDescending(g => g.Sum(i => i.Count))。Take(50).Select(t => new BestTagsResult() {CountLastMonth = t.Count(),Tag = t.Key})   ---- System.NotSupportedException:仅在动态map-reduce查询中支持GroupBy方法

任何想法我该如何进行这项工作?我可以查询过去30天的所有索引数据,并进行groupby / order /内存访问,但这可能会使我的应用程序加载大量数据。

2 个答案:

答案 0 :(得分:2)

您创建的map-reduce索引的结果将为您提供每天的标签数量。您想要最近30天中最受欢迎的广告,因此需要执行以下查询:

var tagCountPerDay = session
                .Query<TagByDayIndex, Toss_TagPerDay>()
                .Where(i => i.CreatedOn >= DateTime.Now.AddDays(-30))
                .ToList();

然后您可以按标签对客户端进行分组:

var mostUsedTags = tagCountPerDay.GroupBy(x => x.Tag)
                        .Select(t => new BestTagsResult()
                        {
                            CountLastMonth = t.Count(),
                            Tag = t.Key
                        })
                        .OrderByDescending(g => g.CountLastMonth)
                        .ToList();

答案 1 :(得分:0)

该错误的原因是您不能在对索引进行的查询中使用'GroupBy'

'GroupBy '可以在执行“动态查询”时使用

即对集合进行的查询,但未指定索引。

请参阅:

https://ravendb.net/docs/article-page/4.1/Csharp/client-api/session/querying/how-to-perform-group-by-query