如何使用map / reduce从couchbase获取所有maxes?

时间:2018-02-27 18:42:52

标签: views couchbase

我有很多记录,如:

{
   "id": "1000",
   "lastSeen": "2018-02-26T18:49:21.863Z"
}
{
   "id": "1000",
   "lastSeen": "2017-02-26T18:49:21.863Z"
}
{
   "id": "2000",
   "lastSeen": "2018-02-26T18:49:21.863Z"
}
{
   "id": "2000",
   "lastSeen": "2017-02-26T18:49:21.863Z"
}

我想获取所有ID的最新记录。因此,在这种情况下,输出将是以下(最近的记录为ids 1000和2000):

{
   "id": "1000",
   "lastSeen": "2018-02-26T18:49:21.863Z"
}

{
   "id": "2000",
   "lastSeen": "2018-02-26T18:49:21.863Z"
}

使用N1QL,这将是

SELECT id, MAX(lastSeen) FROM mybucket GROUP BY id

我如何使用couchbase视图和map / reduce?

谢谢!

2 个答案:

答案 0 :(得分:1)

我远不是map / reduce的常规用户,可能会有更高效的JavaScript,但请试试这个:

地图

function (doc, meta) {
  emit(doc.id, doc.lastSeen);
}

减少

function reduce(key, values, rereduce) {
    var max = values.sort().reverse()[0];
    return max;
}

过滤:?limit=6&stale=false&connection_timeout=60000&inclusive_end=true&skip=0&full_set=true&group_level=1

我们的想法是对发出的所有值进行排序(lastSeen)。由于它们是ISO 8601并且可以按字母顺序排序,sort()工作得很好。你想要最新的,这就是reverse()的用途(否则你得到最老的)。

过滤器的group_level为1,因此它将按doc.id字段进行分组。

答案 1 :(得分:0)

您可以通过降序查询并减少到列表中的第一个,如下所示: 地图:

$rake assets:precompile

减少:

function (doc, meta) {
  emit(doc.id, doc.lastSeen);
}

过滤器:

function reduce(key, values, rereduce) {
    return values[0];
}

这将消除在reduce函数中对分组值进行排序的开销。