设置字段时CouchDB中的更改通知
我试图在预先定义的字段设置或更改后立即在CouchDB更改轮询中获取通知。我已经了解了可用于过滤更改事件的过滤器(设置字段时CouchDB中的更改通知,couchdb,Couchdb,我试图在预先定义的字段设置或更改后立即在CouchDB更改轮询中获取通知。我已经了解了可用于过滤更改事件的过滤器(db/\u changes?filter=myfilter)。但是,我还没有找到一种方法来包含这个时态信息,因为您只能在这个过滤器函数中获取文档的当前版本 是否有可能创建这样一个过滤器 如果它不起作用,我可以将我的字段导出到一个单独的数据库中,并对该数据库中的更改进行唯一的轮询,但出于明显的原因,我更愿意将数据保存在一起 提前谢谢 你是对的:过滤器和\u更改提要只能看到文档的快照。您
db/\u changes?filter=myfilter
)。但是,我还没有找到一种方法来包含这个时态信息,因为您只能在这个过滤器函数中获取文档的当前版本
是否有可能创建这样一个过滤器
如果它不起作用,我可以将我的字段导出到一个单独的数据库中,并对该数据库中的更改进行唯一的轮询,但出于明显的原因,我更愿意将数据保存在一起
提前谢谢 你是对的:过滤器和
\u更改
提要只能看到文档的快照。您需要的是一个能够查看旧文档和新文档并正确操作的函数。但这在\u过滤器
和\u更改
中不可用
显然,您的客户机代码知道它是否更新了该字段。您可以更新客户端代码,但有更好的解决方案
更新功能可以访问这两个文档。我建议您进行更新
用于通知字段更改并在文档中标记字段更改的函数。下一个你
使用一个简单的过滤器检查该标志。最好的部分是,你可以使用
重写函数,使HTTP API与以前完全相同
1.创建一个更新函数来标记感兴趣的更新
您的\u design/myapp
将是{“更新”,“智能更新程序”:(见下文)}
。
更新功能非常灵活(参见我最近的
演练)。然而,我们只想模仿正常的HTTP/JSON API
您的更新。智能更新程序字段如下所示:
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}}];
}
现在你可以把它放到或发布到/db/\u design/myapp/\u update/[doc\u id]
,它会让你感觉
与普通API一样,除非您更新了美元字段,否则它将添加
另一个标志,i\u已更改
。这就是你会发现这种变化的方式
稍后
2.筛选具有已更改字段的文档
这非常简单:
function(doc, req) {
return doc.i_was_changed;
}
现在,您可以使用?过滤器=
参数查询\u更改
提要。(复制
还支持此筛选器,因此您可以将所有文档拉到本地系统
最近更改/创建该字段的
这是最基本的想法。剩下的步骤将使你的生活更轻松,如果你
已经有很多客户端代码,不想更改URL
3.使用重写保持HTTP API不变
这在CouchDB 0.11中提供,最好的资源是Jan的博客文章,
简单地说,您需要一个vhost,它将所有流量发送到您的重写器(重写器本身)
是基于URL的所有设计文档功能的灵活“保镖”(bouncer)
然后在设计文档中需要一个rewrites
字段,类似于(而不是
测试)
(再一次,我从示例和现有代码中获得了这段代码
大约,但它不是100%调试。不过,我认为这使想法非常清楚。
还要记住,这一步是可选的,但优点是,你永远不必这样做
更改客户端代码。)什么是“临时信息”是否要包括?时间信息与文档修订有何关系?时间信息只是字段的旧状态,因此我可以检查它是否已更改。可能存在复杂的解决方法。是的,以前从未听说过更新处理程序。这将起到作用。非常感谢!
curl -X PUT http://example.com:5984/_config/vhosts/example.com \
-d '"/db/_design/myapp/_rewrite"'
[
{
"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" : "../../../*"
}
]