【问题标题】:Getting count of distinct groupings in RavenDB index获取 RavenDB 索引中不同分组的计数
【发布时间】:2013-05-06 23:46:23
【问题描述】:

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

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

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

我想做的是计算特定NamespaceVideoId 实例的不同数量。

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

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 值的计数?

【问题讨论】:

  • 如何进行非重复计数是一个很好的问题。但是,如果您的 Id 值类似于 clips/youtube/12345678901 - 那么是否已经没有重复的可能性?
  • @MattJohnson 否,因为时间组件也嵌入在 ID 中。所以 ID 类似于:clips/youtube=12345678901;t=10。另一个有效的 ID 可能是 clips/youtube=12345678901;t=20 所以VideoId 之间的唯一性保证。

标签: mapreduce ravendb


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

  • 我想到了每个视频单独的文档,但这在文档设计的眼中吐了,不是吗?有什么方法可以查询另一个索引中的索引吗?如果我能做到这一点,那就很简单了。
  • Raven 有“multi-map”,但没有“multi-reduce”。获得它的唯一方法是使用文档作为中介。索引属性适用于此。不,它不会让文档设计负责人感到不安。有人可能会说您根本不需要 clip 文档 - 但即使您决定这样做,也可以在必要时复制数据。
  • 我为什么要使用 Indexed Properties 捆绑包(另外,我在 Raven HQ,所以不能保证我可以使用它)?我问是因为NamespaceVideoId 属性保证是不可变的;它们构成了文档的Id,所以我不知道我从使用索引属性包中获得了什么(看起来我将维护一个单独的文档)。
  • 在旁注中,我可以看到将Video 作为文档,然后将Clip 作为文档的子级的好处;问题是,我需要一个不同的键来识别剪辑(这让我意识到我将不得不重新键入我的 Clip 实例,因为我将在网络上显示它们并且想要使用自动- 生成的 ID,而不是我正在创建的复合 ID)。
  • Indexed Properties bundle 将为您维护您的 Video 文档 - 如果您只需要它们是两个单独的 m/r 索引之间的暂存。听起来你是对的,你不需要它。直接编写 Video 文档的应用程序可能会更好。
猜你喜欢
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多