我有这份文件,一个帖子:
{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 /内存访问,但这可能会使我的应用程序加载大量数据。
答案 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 '可以在执行“动态查询”时使用
即对集合进行的查询,但未指定索引。
请参阅: