C# Raven DB:这个多重映射/减少索引有什么问题?

C# Raven DB:这个多重映射/减少索引有什么问题?,c#,mapreduce,ravendb,C#,Mapreduce,Ravendb,我上次使用和使用计数的Sum和Max调用错误。它们始终是存储在当前设置为0的第二个“贴图”值中的值。我可以让它变成-100,这就是减少的结果。我注意到有人说你应该把它做成一个数组,但我不明白这有什么帮助。我有一个使用map/reduce的对象上的linq表达式,假设两个映射联合在一起,该表达式可以正常工作 以下是数据=> 我想支持这样的查询 var stats = Session.Query<MultiMapApiKeyStats.ApiKeyStats, MultiMap

我上次使用和使用计数的Sum和Max调用错误。它们始终是存储在当前设置为0的第二个“贴图”值中的值。我可以让它变成-100,这就是减少的结果。我注意到有人说你应该把它做成一个数组,但我不明白这有什么帮助。我有一个使用map/reduce的对象上的linq表达式,假设两个映射联合在一起,该表达式可以正常工作

以下是数据=>

我想支持这样的查询

        var stats = Session.Query<MultiMapApiKeyStats.ApiKeyStats, MultiMapApiKeyStats>()
            .Customize(x => x.WaitForNonStaleResultsAsOfNow())
            .Where(x => x.AccountId == Account.Id)
            .OrderBy(x => x.Key).ToList();
然后建立一个像


索引错误序列不包含匹配元素是对空集合调用First的结果,这就是为什么应该使用FirstOrDefault。此外,在map和reduce声明中引用您自己的类将导致错误,因为RavenDB无法在索引时解析这些类型。

一件似乎不正确的事情是分组依据应该是:group result by new{result.AccountId,result.ApiKeyId}。此外,例如,为什么在结果集中有模式?或者身份和类型?这些是目前的占位符。通过两者进行分组,我能得到什么?这似乎是合乎逻辑的,尽管我不知道您的数据模型。我认为实际原因是ApiKey.ApplicationType.None是代码中可用的静态成员,但是当RavenDB转到索引时,它不会引用您的代码库,也不知道如何处理它。您只能在map和reduce声明中引用BCL类型。我更新了reduce以不使用那些占位符。索引在RDBMS中工作,但lastused和usage count为0。如果我按新帐户ID和apikeyid分组,它不会显示任何记录。studio中是否显示任何索引错误?您是否从map/reduce声明中删除了对类的引用?另外,尝试使用FirstOrDefault而不是First。那么为什么序列不包含任何元素呢?我正在将我所有的文档映射到某个东西上,或者该模式是唯一的罪魁祸首?这可能与RavenDB执行reduce的方式有关,reduce假设集合可能是空的。
 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()
                                           };