我在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
值的计数?
答案 0 :(得分:1)
执行此操作的一种方法可能是按NameSpace
和VideoId
进行分组。这将为您提供不同的项目。然后,您必须在TransformResults
部分计算所有这些组。但是,我不建议使用大量项目。转换步骤作为查询的一部分运行,因此性能将是一个大问题。
更好的方法是为每个视频保留一个额外的单独文档(不是每个剪辑)。例如:
videos/youtube/12345678901
{
"Title": "whatever",
"NumberOfClips": 3,
"Clips": ["clipid1","clipid2","clipid3"]
}
我在那里放了一些可能对其他用途有用的属性,但重点是每个视频只有一个文档。
构建这些文档可以通过几种不同的方式完成:
您可以在应用程序中编写代码,以便在撰写Video
文档的同时添加/更新Clip
文档。
您可以通过NameSpace / VideoId为Clip
文档和组编写map / reduce索引,然后使用Indexed Properties Bundle维护Video
文档。结果
无论哪种方式,一旦你拥有了一组Video
文件,你就可以对这些文件做一个简单的地图/缩小,以获得不同视频的数量。