【问题标题】:Chained map/reduce in couchDBcouchDB 中的链式 map/reduce
【发布时间】:2014-08-13 03:09:46
【问题描述】:

在 couchDB 中,我有一组类似以下的项目(例如,为了简化):

{_id: 1, date: "Jul 1", user: "user1"}
{_id: 2, date: "Jul 2", user: "user1"}
{_id: 3, date: "Jul 3", user: "user2"}
...etc...

我想要一个“最近的活动”列表,按日期排序,没有重复的用户 _id。我可以创建一个具有如下结果的视图:

{key: "July 3", _id: 3, user: "user2"}
{key: "July 2", _id: 2, user: "user1"}
{key: "July 1", _id: 1, user: "user1"}

但这包含同一用户的重复条目。或者我可以创建一个映射 {key: user, value: date} 的视图并减少到

{key: "user1", mostRecentDate: "July 2"}
{key: "user2", mostRecentDate: "July 3"}

但这不是按“最近”排序的。

我知道不支持明显的解决方案 - 减少另一个视图的结果。 BigCouch 支持链式 map/reduce,但似乎已经过时/不受支持(2012 年最新版本)。

这似乎是一个相当普遍的问题 - 有哪些现有的解决方案(除了“切换数据库”)?

【问题讨论】:

  • rcouch 具有基于视图的 _changes,可让您进行链式映射减少。 rcouch 的大部分好东西都合并到了 couchdb 2.0 中,所以如果你可以稍等一下,默认情况下你可以在 couchdb 中进行链式 map reduce。如果您使用 cloudant,它原生支持 chanined map reduce
  • 映射[日期,用户]的视图怎么样?如果您的日期是可排序的(如 ISO 8601)并且您使用 descending=true 进行查询,则应按最近的日期排序。
  • 与第一个示例一样,每个用户仍将包含重复条目。将它移动到键而不是值不会获得任何收益。
  • 嗨@AkshatJiwanSharma 我一直在尝试查找有关 couchdb 2.0 中 rcouch 功能的更多信息。我在这里问,因为我想其他人会走这条路。你知道这个功能是否已经进入了 couchdb2.0-dev 版本吗? developer.ibm.com/clouddataservices/2016/03/18/…
  • 查看Issue Tracker 我只能找到一个没有任何活动的旧问题。感谢您的链接,我还找到了this doc about Barrel(显然是 rcouch 的继任者),但也许某处有更好的文档?

标签: couchdb


【解决方案1】:

这里是关于如何使用 couchdb 1.xxx 进行链式 map reduce 的总体思路。我们想要的是能够将一个 map/reduce 的结果传递给另一个。

  1. 订阅视图过滤的 _changes 提要。这将为您提供 map 函数实际发出的文档列表。

  2. 接下来我们需要为这些过滤后的文档调用视图函数。这很简单,因为我们可以将键列表传递给视图,因此我们只需传递键并获得视图的所需结果子集。

  3. 接下来,我们将此结果推送到单独的数据库或同一个数据库中。我们可以使用批量插入来更快地执行插入。如果您使用单独的数据库,您甚至可以从视图结果中重用_id's,这样批量更新就会容易得多。

  4. 在这个数据库中,我们定义了另一个视图,它根据值对我们的结果进行排序。

    {key: "user1", mostRecentDate: "July 2"} {key: "user2", mostRecentDate: "7 月 3 日"}

既然您已经完成了这一步,您需要做的就是在第二个数据库中的mostRecentDate 上创建一个视图,您将获得按日期排序的用户活动。

我希望您使用的是虚拟减少。返回 null 且仅用于group=true 的一种。

在第 4 步中使用列表功能可以让您的生活更轻松。由于批量更新要求文档列表采用{"docs":[....]} 的形式,您可以使用列表功能轻松获得它。

【讨论】:

  • 这是 2014 年 8 月。有人知道我们现在是否更接近于在 2015 年 11 月/2015 年在 CouchDB 的开源版本中获得 Chained Map Reduce?
  • 来自未来的问候! 2019 年我们过得怎么样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 2011-09-22
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多