CouchDB视图:按时间删除重复*和*顺序

时间:2010-11-28 20:36:34

标签: views couchdb mapreduce

基于我previous question的一个很好的答案,我已经部分地解决了我在CouchDB中遇到的问题。

这导致a new view

现在,我需要做的下一件事就是从这个视图中删除重复项,而按日期排序。

例如,以下是我查询该视图的方式:

GET http://scoates-test.couchone.com/follow/_design/asset/_view/by_userid_following?endkey=[%22c988a29740241c7d20fc7974be05ec54%22]&startkey=[%22c988a29740241c7d20fc7974be05ec54%22,{}]&descending=true&limit=3

导致:

HTTP 200 http://scoates-test.couchone.com/follow/_design/asset/_view/by_userid_following
http://scoates-test.couchone.com > $_.json.rows
[ { id: 'c988a29740241c7d20fc7974be067295'
  , key: 
     [ 'c988a29740241c7d20fc7974be05ec54'
     , '2010-11-26T17:00:00.000Z'
     , 'clementine'
     ]
  , value: 
     { _id: 'c988a29740241c7d20fc7974be062ee8'
     , owner: 'c988a29740241c7d20fc7974be05f67d'
     }
  }
, { id: 'c988a29740241c7d20fc7974be068278'
  , key: 
 [ 'c988a29740241c7d20fc7974be05ec54'
     , '2010-11-26T15:00:00.000Z'
     , 'durian'
     ]
  , value: 
     { _id: 'c988a29740241c7d20fc7974be065115'
     , owner: 'c988a29740241c7d20fc7974be060bb4'
     }
  }
, { id: 'c988a29740241c7d20fc7974be068026'
  , key: 
     [ 'c988a29740241c7d20fc7974be05ec54'
     , '2010-11-26T14:00:00.000Z'
     , 'clementine'
     ]
  , value: 
     { _id: 'c988a29740241c7d20fc7974be063b6d'
     , owner: 'c988a29740241c7d20fc7974be05ff71'
     }
  }
]

正如你所看到的,“克莱门汀”出现了两次。

如果我更改视图以将水果/资产名称作为第二个键(而不是时间)发出,我可以更改分组深度以折叠这些,但这并不能解决我的按时间顺序要求。同样,通过上述设置,我可以按时间排序,但我无法将重复的资产名称折叠为单行(例如,每页允许10个资产)。

不幸的是,这不是一个简单的问题需要解释。也许this chat transcript会有所帮助。

请帮忙。我担心我需要做的事情仍然不可能。

取值

2 个答案:

答案 0 :(得分:7)

您可以使用列表功能执行此操作。下面是一个生成一个非常简单的列表的示例,其中包含所有没有dupes的所有者字段。您可以轻松地修改它以生成json或xml或任何您想要的内容。

将它放入lists.nodupes中的资产设计文档中并使用如下: http://admin:123@127.0.0.1:5984/follow/_design/assets/_list/nodupes/by_userid_following_reduce?group=true

function(head, req) {
    start({
          "headers": {
          "Content-Type": "text/html"
          }
         });
    var row;
    var dupes = [];
    while(row = getRow()) {
    if (dupes.indexOf(row.key[2]) == -1) {
        dupes.push(row.key[2]);
        send(row.value[0].owner+"<br>");
    }
    } 
}

答案 1 :(得分:2)

按一个字段排序并在另一个字段上单独排列不是基本地图缩减可以做的事情。它所能做的就是对数据进行排序,并将减少汇总应用于动态键范围。

要查找每种水果的最新条目,您需要每个水果查询一次。

有一些方法可以做到这一点,有点理智。

您需要一个包含[fruit_type,date]等键的视图,然后您可以这样查询:

for fruit in fruits
  GET /db/_design/foo/_view/bar?startkey=["apples"]&limit=1&descending=true

这将为您提供每种水果的最新条目。

列表操作可用于执行此操作,它只会回显每个水果块的第一行。只要每个水果具有少量条目,这就足够有效。一旦每个水果有很多条目,你将丢弃比你回声更多的数据,因此当你到达一个大型数据集时,多查询方法实际上比列表方法更好。幸运的是,他们都可以在相同的视图索引上工作,所以当你不得不切换它时,这将不是什么大问题。