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