如何为CouchDB中创建的每个新文档添加字段

时间:2014-02-21 12:03:08

标签: 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。 这让我相信更新函数只能在现有文档上调用,尽管文档似乎暗示了什么,或者我错了?

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

甚至可能......?

2 个答案:

答案 0 :(得分:4)

是的,您可以使用更新处理程序执行此操作。你走在正确的轨道上。以下是3个案例:

创建doc而不指定id

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

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

创建具有给定ID

的文档

所采用的路径为!doc && req.id。你有这个权利。

更新现有文档

所采用的路径为doc。你有这个权利。

答案 1 :(得分:1)

感谢西蒙指出我正确的方向。这是我最终使用的剧本;

function(doc,req) { 
   if (!doc) { 
       var new_doc = {}; 
       if ( req.id) { 
           new_doc._id = req.id; 
       } else { 
            new_doc._id = req.uuid; 
       } 
       new_doc.timestamp = new Date().getTime(); 
       new_doc.body = eval('(' + req.body + ')'); 
       return [new_doc,'added new']; 
   } 
   doc.timestamp = new Date().getTime(); return [doc,'updated'];
 }

请注意,我必须在请求中添加一个“eval”,以便将新文档的内容添加到调用者提供的内容中。