我有很多记录,如:
{
"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?
谢谢!
答案 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函数中对分组值进行排序的开销。