1

我在 RavenDB 中有许多文档,格式如下:

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

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

我想做的是计算VideoId特定Namespace.

起初,我认为我可以处理映射中的不同:

from v in docs.Clips.Select(c => new { c.Namespace, c.VideoId }).Distinct()

但这不起作用,因为该查询并未在整个文档集上运行(因此无法在Distinct此处执行调用)。

我曾考虑尝试在 reduce 部分处理这个问题,但我想不出一个可以适当分组的聚合操作。

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

new { Type = "providercount", Key = "youtube", Count = 1 }

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

如何使用此文档结构生成不同Namespace/值的计数?VideoId

4

1 回答 1

1

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

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

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

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

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

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

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

无论哪种方式,一旦您拥有了一组Video文档,您就可以对这些文档进行简单的 map/reduce 以获取不同视频的数量。

于 2013-05-06T15:46:23.643 回答