在couchDB中,我有一组如下所示的项目(简化为例如')
{_id: 1, date: "Jul 1", user: "user1"}
{_id: 2, date: "Jul 2", user: "user1"}
{_id: 3, date: "Jul 3", user: "user2"}
...etc...
我希望得到一个"最近的活动列表",按日期排序,没有重复的用户_ids。我可以使用如下结果创建一个视图:
{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年最后一个版本)。
这似乎是一个相当普遍的问题 - 现有的解决方案是什么(超越"切换数据库")?
答案 0 :(得分:1)
以下是关于如何使用couchdb 1.xxx进行链式地图缩减的一般概念。我们想要的是能够将一个map / reduce的结果传递给另一个map / reduce。
订阅由视图过滤的_changes Feed。这将为您提供map函数实际发出的文档列表。
接下来,我们需要为这些过滤的文档调用视图函数。它很简单,因为我们可以将一个键列表传递给视图,因此我们只需传递键并获得视图所需的结果子集。
接下来,我们将此结果推送到单独的数据库或同一个数据库中。我们可以使用批量插入来更快地执行插入。如果您使用单独的数据库,您甚至可以从视图结果中重用_id's
,这样批量更新就会容易得多。
在此数据库中,我们定义了另一个视图,该视图根据值对结果进行排序。
{key:" user1",mostRecentDate:" July 2"} {key:" user2",mostRecentDate:" July 3"}
因为您已完成此步骤,所以您需要做的就是在第二个数据库中的mostRecentDate
上创建一个视图,您将获得按日期排序的用户活动。
我希望你使用虚拟减少。一个返回null并仅用于group=true
。
在步骤4中使用列表功能可以让您的生活更轻松。由于批量更新要求文档列表采用{"docs":[....]}
格式,因此您可以轻松地使用列表功能一次性获取文档。