python - 如何向在 CouchDB 中创建的每个新文档添加字段

标签 python couchdb

我知道那里有几个类似的问题(例如这个问题:CouchDB - trigger code when creating or updating document),它们指的是 CouchDB 中的“更新处理程序”,但我没能看到他们是如何解决这个问题的;

  • 每次在我的 CouchDB 数据库中创建一个新文档时,我都想添加一个时间戳
  • 我在 _design/updatehandlers 中创建了一个更新处理程序并验证它被调用了:

    "timestampadd" : "function(doc,req) {
    if (!doc) { 
        if ( req.id) { 
            return [{_id : req.id, timestamp : new Date().getTime()}];
        }
        return [null,'added empty'];
    }
    doc.timestamp = new Date().getTime(); 
    return [doc,'added at ' + doc.timestamp];
    }"
    

我的问题是这样的;在数据库中创建新文档时如何使用此函数,即我通常通过对

执行 POST 创建的文档
    http://mycouchdb:5984/test_db

我希望 couchdb 在哪里为我创建一个 _id(参见示例:http://docs.cloudant.com/tutorials/crud/index.html#create)?

如果我按照文档来做(在本例中使用 Python),我会像这样发布一个帖子;

   requests.post("http://mycouchdb:5984/test_db/_design/updatehandlers/_update/timestampadd",headers={'Content-type':'application/json'},data='{"foo":"bar"})

但是这里的更新函数 timestampadd 采用了 "doc==null && req.id==null 路径,很明显,因为文档还没有被创建而且我没有指定 ID。 这让我相信更新功能只能在现有文档上调用,尽管文档似乎暗示了什么,或者我错了吗?

我可以在现有文档上调用更新并添加时间戳,没有任何问题,效果很好,但这里的问题是在创建文档时添加时间戳。

这有可能吗?

最佳答案

是的,您可以使用更新处理程序来做到这一点。你在正确的轨道上。以下是 3 种情况:

创建不指定id的文档

采用的路径是!doc && !req.id。 那是你的例子。您不应返回 null,而应构建一个新文档并将其返回。您可以使用 req.uuid 来填充 _id。例如:

return [{_id : req.uuid, timestamp : new Date().getTime()}, 'created new doc'];

用给定的id创建一个文档

采用的路径是!doc && req.id。你没看错。

更新现有文档

所采用的路径是doc。你没看错。

关于python - 如何向在 CouchDB 中创建的每个新文档添加字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21933986/

相关文章:

ios - CouchDB 和 iOS

python - Python 有类似 Java 的匿名内部类的东西吗?

python - 子进程命令未使用 ls 命令查找文件?

ubuntu - 在旧 Ubuntu 10.04 上升级 couchdb/erlang

couchdb - 在 Cloudant 上挂起复制

java - 比较两个时间戳天数

node.js - 使用 Node.js 的 CouchDB 客户端支架时如何处理文档更新冲突?

python - 使用 OpenCV python 在一个窗口中结合多个 Canny 边缘检测

python - 如何划分 Pandas 数据框中除特定行以外的所有行?

python - 使用 python 添加两个自定义数据类型?