gpt4 book ai didi

couchdb - 设置字段时更改 CouchDB 中的通知

转载 作者:行者123 更新时间:2023-12-04 12:14:28 25 4
gpt4 key购买 nike

我正在尝试在设置或更改预定义字段后立即在 CouchDB 更改轮询中获取通知。我已经看过可用于过滤更改事件的过滤器( db/_changes?filter=myfilter )。但是,我还没有找到一种方法来包含此时间信息,因为您只能在此过滤器函数中获取文档的当前版本。

有没有可能创建这样的过滤器?

如果它不起作用,我可以将我的字段导出到一个单独的数据库,并且唯一轮询该数据库中的更改,但出于明显的原因,我更愿意将我的数据放在一起。

提前致谢!

最佳答案

你是对的:过滤器和 _changes feeds 只能看到文档的快照。您需要的是一个可以查看旧文档和新文档并正确操作的功能。但这在 _filters 中不可用和 _changes .

显然,您的客户端代码知道它是否更新了该字段。您可能会更新您的客户端代码,但有更好的解决方案。

更新函数可以访问这两个文档。 我建议你做一个_update
函数会注意到字段更改并标记文档中的字段。接下来你
有一个简单的过滤器检查该标志。最好的部分是,您可以使用
重写函数,使 HTTP API 与以前完全相同。

1. 创建一个更新函数来标记有趣的更新

您的 _design/myapp将是 {"updates", "smart_updater": "(see below)"} .
更新功能非常灵活(见我最近的update handlers
演练)。然而,我们只想模仿普通的 HTTP/JSON API。

您的 updates.smart_updater字段看起来像这样:

function (doc, req) {
var INTERESTING = 'dollars'; // Set me to the interesting field.

var newDoc = JSON.parse(req.body);
if(newDoc.hasOwnProperty(INTERESTING)) {
// dollars was set (which includes 0, false, null, undefined
// values. You might test for newDoc[INTERESTING] if those
// values should not trigger this code.
if((doc === null) || (doc[INTERESTING] !== newDoc[INTERESTING])) {
// The field changed or created!
newDoc.i_was_changed = true;
}
}

if(!newDoc._id) {
// A UUID generator would be better here.
newDoc._id = req.id || Math.random().toString();
}

// Return the same JSON the vanilla Couch API does.
return [newDoc, {json: {'id': newDoc._id}}];
}

现在您可以 PUT 或 POST 到 /db/_design/myapp/_update/[doc_id]它会感觉
就像普通的 API 一样,除非你更新了美元字段,它会添加
附加标志, i_was_changed .这就是你会发现这个变化的方式
之后。

2. 过滤具有更改字段的文档

这非常简单:
function(doc, req) {
return doc.i_was_changed;
}

现在您可以查询 _changes?filter= 喂食范围。 (复制
也支持此过滤器,因此您可以将所有文档拉到本地系统
最近更改/创建了该字段。

这就是基本思想。剩下的步骤会让你的生活更轻松,如果你
已经有很多客户端代码,不想更改 URL。

3. 使用重写来保持 HTTP API 不变

这在 CouchDB 0.11 中可用,最好的资源是 Jan 的博客文章,
nice URLs in CouchDB .

简而言之,您需要一个 vhost 将所有流量发送到您的重写器(它本身
是基于 URL 的所有设计文档功能的灵活“bouncer”)。
curl -X PUT http://example.com:5984/_config/vhosts/example.com \
-d '"/db/_design/myapp/_rewrite"'

那么你想要一个 rewrites设计文档中的字段,例如(不是
测试)
[
{
"comment": "Updates should go through the update function",
"method": "PUT",
"from": "db/*",
"to" : "db/_design/myapp/_update/*"
},
{
"comment": "Creates should go through the update function",
"method": "POST",
"from": "db/*",
"to" : "db/_design/myapp/_update/*"
},
{
"comment": "Everything else is just like normal",
"from": "*",
"to" : "../../../*"
}
]

(再一次,我从示例和现有代码中获得了这段代码
周围,​​但它不是 100% 调试。但是我认为它使这个想法非常清楚。
还要记住这一步是可选的,但好处是,你永远不必
更改您的客户端代码。)

关于couchdb - 设置字段时更改 CouchDB 中的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3021950/

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