代码之家  ›  专栏  ›  技术社区  ›  b_erb

设置字段时在couchdb中更改通知

  •  7
  • b_erb  · 技术社区  · 16 年前

    我正在尝试在一个couchdb更改投票中获取通知,只要预先定义的字段被设置或更改。我已经看过可用于筛选更改事件的筛选器( db/_changes?filter=myfilter )但是,我还没有找到一种方法来包含这些临时信息,因为您只能在这个过滤器函数中获得文档的当前版本。

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

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

    事先谢谢!

    1 回复  |  直到 16 年前
        1
  •  6
  •   Community Mohan Dere    9 年前

    你是对的:过滤器和 _changes 源只能查看文档的快照。你需要的是 可以查看旧文档和新文档的功能 正确行动。但在 _filters 变化 .

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

    更新功能可以访问两个文档。 我建议你更新一下 注意字段更改并标记文档中字段的函数。下一个你 有一个简单的过滤器来检查这个标志。最好的部分是,你可以使用 重写函数,使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}}];
    }
    

    现在你可以把或邮寄到 /db/_design/myapp/_update/[doc_id] 它会感觉到 和普通的API一样,除了 如果更新“美元”字段,它将添加 附加标志 , i_was_changed . 你就是这样找到这个零钱的 后来。

    2。筛选具有已更改字段的文档

    这非常简单:

    function(doc, req) {
        return doc.i_was_changed;
    }
    

    现在您可以查询 变化 用A喂养 ?filter= 参数。(复制 还支持此筛选器,因此您可以将所有文档拉到本地系统 最近更改/创建了字段。

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

    三。使用重写保持HTTP API相同

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

    简单地说,您需要一个vhost,它将所有流量发送到您的重写器(它本身 是一个灵活的“保镖”,以所有基于URL的设计文档功能)。

    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%的调试。不过,我认为这让这个想法非常清楚。 还要记住,这个步骤是可选的,但是好处是,你永远不必 更改客户端代码。)