在RavenDB索引中计算不同的分组

时间:2013-05-06 14:09:15

标签: mapreduce ravendb

我在RavenDB中有以下形式的许多文档:

{
    "Id": "composite of namespace and video id",
    "Namespace": "youtube",
    "VideoId": "12345678901",
    "Start": "00:00:05"
}

我有很多文件引用了实际的不同部分;在这种情况下,我有多个文档代表视频中的不同时间戳。

我想要做的是计算特定VideoId的{​​{1}}个实例的不同数量。

起初,我以为我可以处理映射中的distinct:

Namespace

但这不起作用,因为该查询不会在整个文档集上运行(所以这里不可能执行from v in docs.Clips.Select(c => new { c.Namespace, c.VideoId }).Distinct() 调用。)

我已经考虑过在reduce部分尝试处理这个问题了,但是我想不出一个可以合适地对它进行分组的聚合操作。

现在map / reduce结构的形状是:

Distinct

因为这是产生摘要的多地图的一部分。

如何使用此文档结构生成不同new { Type = "providercount", Key = "youtube", Count = 1 } / Namespace值的计数?

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法可能是按NameSpaceVideoId进行分组。这将为您提供不同的项目。然后,您必须在TransformResults部分计算所有这些组。但是,我不建议使用大量项目。转换步骤作为查询的一部分运行,因此性能将是一个大问题。

更好的方法是为每个视频保留一个额外的单独文档(不是每个剪辑)。例如:

videos/youtube/12345678901
{
    "Title": "whatever",
    "NumberOfClips": 3,
    "Clips": ["clipid1","clipid2","clipid3"]
}

我在那里放了一些可能对其他用途有用的属性,但重点是每个视频只有一个文档。

构建这些文档可以通过几种不同的方式完成:

  • 您可以在应用程序中编写代码,以便在撰写Video文档的同时添加/更新Clip文档。

  • 您可以通过NameSpace / VideoId为Clip文档和组编写map / reduce索引,然后使用Indexed Properties Bundle维护Video文档。结果

无论哪种方式,一旦你拥有了一组Video文件,你就可以对这些文件做一个简单的地图/缩小,以获得不同视频的数量。