我有一个系统接受来自各种独特来源的状态更新,并且每次状态更新都会创建一个具有以下结构的新文档:
{
"type": "status_update",
"source_id": "truck1231",
"timestamp": 13023123123,
"location": "Boise, ID"
}
数据纯粹是示例,但可以理解。
现在,这些文档每隔一小时左右生成一次。一小时后,我们可能会插入:
{
"type": "status_update",
"source_id": "truck1231",
"timestamp": 13023126723,
"location": "Madison, WI"
}
我感兴趣的只是查看每个独特来源的最新更新。我目前正在通过以下地图来做到这一点:
function(doc) {
if (doc.type == "status_update") {
emit(doc.source_id, doc);
}
}
并减少:
function(keys, values, rereduce) {
var winner = values[0];
var i = values.length;
while (i--) {
var val = values[i];
if (val.timestamp > winner.timestamp) winner = val;
}
return winner;
}
并将数据作为 reduce 查询group=true
。这可以按预期工作,并仅提供最新更新的键控结果。
问题是它非常慢,需要我reduce_limit=false
在 CouchDB 配置中进行。
感觉必须有一种更有效的方法来做到这一点。更新同一个文档不是一种选择——即使在这种情况下我不需要它,历史也很重要。在客户端处理数据也不是一种选择,因为这是一个 CouchApp,并且系统中的文档数量实际上非常大,并且不适合通过网络发送它们。
提前致谢。