couchDB中的链式映射/约简

couchDB中的链式映射/约简,couchdb,Couchdb,在couchDB中,我有一组类似于以下内容的项(为了便于示例简化): 我想得到一个“最近的活动”列表,按日期排序,没有重复的用户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

在couchDB中,我有一组类似于以下内容的项(为了便于示例简化):

我想得到一个“最近的活动”列表,按日期排序,没有重复的用户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"}
但这并不是按“最近”排序的

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


这似乎是一个相当常见的问题-除了“切换数据库”之外,还有哪些现有的解决方案?

以下是如何使用couchdb 1.xxx进行链式地图缩减的一般思路。我们想要的是能够将一个map/reduce的结果传递给另一个map/reduce的结果

  • 订阅由视图筛选的_changes提要。这将为您提供映射函数实际发出的文档列表

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

  • 接下来,我们将这个结果推送到一个单独的数据库或同一个数据库中。我们可以使用批量插入来更快地执行插入。如果使用单独的数据库,甚至可以从查看结果中重用
    \u id的
    ,这样批量更新就会容易得多

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

    {key:“user1”,最新世纪日期:“7月2日”} {key:“user2”,最新世纪日期:“7月3日”}

  • 由于您已经完成了此步骤,所以只需在第二个数据库中的
    mostRecentDate
    上创建一个视图,就可以获得按日期排序的用户活动

    不过,我希望您使用的是虚拟reduce。返回null且仅用于
    group=true


    在步骤4中使用列表功能可以使您的生活更轻松。由于批量更新要求文档列表的格式为
    {“docs”:[..]}
    您可以使用列表功能轻松地一次获得它。

    有一个基于视图的更改,允许您进行链式地图缩减。rcouch的大部分好东西都合并到了couchdb 2.0中,所以如果您可以稍等一下,您可以在默认情况下在couchdb中进行链式映射缩减。如果您使用cloudant,它支持chanined map reduce Natively映射[日期,用户]的视图是什么?如果您的日期是可排序的(如ISO 8601),并且您使用descending=true进行查询,则应按最近的日期进行排序。与第一个示例一样,每个用户仍将包含重复的条目。将其移动到键而不是值不会得到任何好处。嗨@AkshatJiwanSharma我一直在尝试查找有关couchdb 2.0中rcouch功能的更多信息。我在这里发问,因为我认为其他人会走这条路。您知道这个特性是否已经进入couchdb2.0-dev版本了吗?看一下,我只能找到一个没有任何活动的旧问题。感谢你的链接,我也找到了(显然是rcouch的继任者),但也许有更好的文档?这是2014年8月。有人知道我们在2015年11月是否离在CouchDB的开源版本中使用Chained Map Reduce更近了吗?来自未来的问候!2019年的情况如何?
    {key: "user1", mostRecentDate: "July 2"}
    {key: "user2", mostRecentDate: "July 3"}