Как использовать GroupBy по индексу в RavenDB? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть этот документ, сообщение:

{Содержимое: "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)> = значение (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: метод GroupBy поддерживается только в динамических запросах сокращения карты

Любая идея, как можноЯ делаю эту работу?Я мог бы запросить все данные индекса за последние 30 дней и выполнить групповую обработку / заказ / получение в памяти, но это могло бы заставить мое приложение загружать много данных.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Результаты созданного вами индекса карты-сокращения дадут вам количество тегов в день.Вы хотите получить самые популярные из них за последние 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();
0 голосов
/ 11 февраля 2019

Причина ошибки в том, что вы не можете использовать 'GroupBy' в запросе, выполненном по индексу.

'GroupBy ' можно использоватьпри выполнении «динамического запроса»

, т. е. запроса к коллекции, без указания индекса.

См .:

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

...