Raven DB: Какво не е наред с този индекс за мултимап/намаляване?

Моите сумарни и максимални повиквания при последното използване и броят на използването са грешни. Те винаги са стойността, която се съхранява във втората стойност на картите, която в момента е зададена на 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
Едно нещо, което изглежда неправилно, е, че групирането по трябва да бъде: group result by new { 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
актуализирах намалението, за да не използвам тези държачи на място. индексът работи в RDBMS, но броят на lastused и usage е 0. ако групирам по нов accountid и apikeyid, той не показва никакви записи.   -  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. Освен това препращането към вашите собствени класове в декларациите за карта и намаляване ще доведе до грешки, тъй като RavenDB не може да разреши тези типове по време на индексиране.

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