Raven DB: Что не так с этим индексом multimap/reduce?

Мои вызовы Sum и Max при последнем использовании и подсчете использования неверны. Это всегда значение, которое хранится во втором значении карты, которое в настоящее время установлено на 0. Я могу сделать его -100, и именно таким будет результат уменьшения. Я заметил, что кто-то говорит, что вы должны сделать его массивом, но я не понимаю, как это помогает. У меня есть выражение linq для объектов, использующих map/reduce, которое работает правильно, предполагая, что две карты объединены вместе.

Вот данные => https://gist.github.com/940ccca1b0f8917e9eaf

Я хочу поддержать такой запрос, как

        var stats = Session.Query<MultiMapApiKeyStats.ApiKeyStats, MultiMapApiKeyStats>()
            .Customize(x => x.WaitForNonStaleResultsAsOfNow())
            .Where(x => x.AccountId == Account.Id)
            .OrderBy(x => x.Key).ToList();

и создайте таблицу, например table

 public MultiMapApiKeyStats()
        {
            AddMap<KeyUsageBase>(uses => from use in uses
                                         select new
                                         {
                                             AccountId = use.AccountId,
                                             ApiKeyId = use.ApiKeyId,
                                             Key = (string)null,
                                             UsageCount = 1,
                                             LastUsed = use.LastUsedTicks,
                                             Pattern = (string)null,
                                             Status = ApiKey.KeyStatus.None,
                                             Type = ApiKey.ApplicationType.None
                                         });
            AddMap<ApiKey>(keys => from key in keys
                                   select new
                                          {
                                              AccountId = key.AccountId,
                                              ApiKeyId = key.Id,
                                              Key = key.Key,
                                              UsageCount = 0,
                                              LastUsed = 0,
                                              Pattern = key.Pattern,
                                              Status = key.ApiKeyStatus,
                                              Type = key.Type
                                          });


            Reduce = results => from result in results
                                group result by result.ApiKeyId
                                    into g
                                    select new
                                           {
                                           AccountId = g.Select(x => x.AccountId).FirstOrDefault(),
                                           ApiKeyId = g.Key,
                                           Key = g.Select(x => x.Key).FirstOrDefault(x => x != null),
                                           UsageCount = g.Sum(x => x.UsageCount),
                                           LastUsed = g.Max(x => x.LastUsed),
                                           Pattern = g.Select(x => x.Pattern).FirstOrDefault(),
                                           Status = g.Select(x => x.Status).FirstOrDefault(),
                                           Type = g.Select(x => x.Type).FirstOrDefault()
                                           };

person Steve    schedule 20.09.2012    source источник
comment
Одна вещь, которая кажется неправильной, заключается в том, что группа должна быть: результат группы по новому {result.AccountId, result.ApiKeyId}. Кроме того, почему, например, Pattern в наборе результатов вообще? Или статус и тип?   -  person eulerfx    schedule 20.09.2012
comment
это заполнители на данный момент. что я получаю, группируя по обоим?   -  person Steve    schedule 20.09.2012
comment
Это кажется логичным, хотя я не знаю вашей модели данных. Я думаю, что фактическая причина в том, что ApiKey.ApplicationType.None является статическим членом, доступным в вашем коде, однако, когда RavenDB переходит к индексу, он не ссылается на вашу кодовую базу и не знает, как с этим справиться. Вы можете ссылаться только на типы BCL на карте и уменьшать объявления.   -  person eulerfx    schedule 20.09.2012
comment
я обновил сокращение, чтобы не использовать эти заполнители. индекс работает в СУБД, но счетчик последнего использования и использования равен 0. Если я группирую по новому идентификатору учетной записи и идентификатору апикея, он не показывает никаких записей.   -  person Steve    schedule 20.09.2012
comment
Появляются ли в студии какие-либо ошибки индекса? Вы удалили ссылки на свои классы из объявлений map/reduce? Кроме того, попробуйте использовать FirstOrDefault вместо First.   -  person eulerfx    schedule 20.09.2012
comment
есть некоторые старые ошибки о том, что последовательность не содержит совпадающих элементов, но теперь условия и запрос работают.   -  person Steve    schedule 20.09.2012
comment
вау, использование firstordefault решило проблему...   -  person Steve    schedule 20.09.2012
comment
напишите ответ и я его отмечу   -  person Steve    schedule 20.09.2012


Ответы (1)


Ошибка индексации sequence contains no matching elements является результатом вызова First для пустой коллекции, поэтому вам следует использовать FirstOrDefault. Кроме того, ссылки на ваши собственные классы в объявлениях map и reduce вызовут ошибки, поскольку RavenDB не может разрешить эти типы во время индексации.

person eulerfx    schedule 20.09.2012
comment
так почему последовательность не содержит элементов? я сопоставляю все свои документы с чем-то, или шаблон был единственным виновником? - person Steve; 26.09.2012
comment
Это может быть связано с тем, как RavenDB выполняет сокращение, которое предполагает, что коллекция может быть пустой. - person eulerfx; 26.09.2012