gpt4 book ai didi

CouchDB:返回基于时间戳类型的最新文档

转载 作者:行者123 更新时间:2023-12-05 01:20:22 24 4
gpt4 key购买 nike

我有一个系统接受来自各种唯一来源的状态更新,并且每个状态更新都会创建一个具有以下结构的新文档:

{
"type": "status_update",
"source_id": "truck1231",
"timestamp": 13023123123,
"location": "Boise, ID"
}

数据纯粹是示例,但可以传达想法。

现在,这些文档每隔一小时左右生成一次。一个小时后,我们可能会插入:

{
"type": "status_update",
"source_id": "truck1231",
"timestamp": 13023126723,
"location": "Madison, WI"
}

我感兴趣的是查看每个独特来源的最新更新。我目前正在通过拍摄以下 map 来做到这一点:

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;
}

并使用 group=true 将数据查询为 reduce。这按预期工作,并提供仅最新更新的键控结果。

问题是它非常慢,需要我在 CouchDB 配置中 reduce_limit=false

感觉必须有一种更有效的方法来做到这一点。更新同一个文档不是一种选择——历史很重要,尽管在这种情况下我不需要它。在客户端处理数据也不是一种选择,因为这是一个 CouchApp,而且系统中的文档量实际上非常大,并且通过网络发送它们是不切实际的。

提前致谢。

最佳答案

您可以使用 _stats built-in reduce function 获取每个来源的最新时间戳,然后执行另一个查询以获取文档。以下是观点:

"views": {
"latest_update": {
"map": "function(doc) { if (doc.type == 'status_update') emit(doc.source_id, doc.timestamp); }",
"reduce": "_stats"
},
"status_update": {
"map": "function(doc) { if (doc.type == 'status_update') emit([doc.source_id, doc.timestamp], 1); }"
}
}

首先使用 group=true 查询 latest_update,然后使用类似(正确的 url 编码)的内容查询 status_update:

keys=[["truck123",TS123],["truck234",TS234],...]&include_docs=true

其中 TS123 和 TS234 是 latest_update 返回的 max 的值。

关于CouchDB:返回基于时间戳类型的最新文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10389110/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com