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

设置字段时CouchDB中的更改通知,couchdb,Couchdb,我试图在预先定义的字段设置或更改后立即在CouchDB更改轮询中获取通知。我已经了解了可用于过滤更改事件的过滤器(db/\u changes?filter=myfilter)。但是,我还没有找到一种方法来包含这个时态信息,因为您只能在这个过滤器函数中获取文档的当前版本 是否有可能创建这样一个过滤器 如果它不起作用,我可以将我的字段导出到一个单独的数据库中,并对该数据库中的更改进行唯一的轮询,但出于明显的原因,我更愿意将数据保存在一起 提前谢谢 你是对的:过滤器和\u更改提要只能看到文档的快照。您

我试图在预先定义的字段设置或更改后立即在CouchDB更改轮询中获取通知。我已经了解了可用于过滤更改事件的过滤器(
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"  : "../../../*"
    }
]