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

Python 如何向CouchDB中创建的每个新文档添加字段,python,couchdb,Python,Couchdb,我知道有两个类似的问题(比如这一个:)在CouchDB中提到了“更新处理程序”,但我不知道它们是如何解决这个问题的 每次在CouchDB数据库中创建新文档时,我都想添加一个时间戳 我在_design/updateHandler中创建了一个更新处理程序,并验证了它是否被调用: "timestampadd" : "function(doc,req) { if (!doc) { if ( req.id) { return [{_id : req.id, timestamp

我知道有两个类似的问题(比如这一个:)在CouchDB中提到了“更新处理程序”,但我不知道它们是如何解决这个问题的

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

    "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];
    }"
    
我的问题是,;在数据库中创建新文档时,如何使用此功能,即通常通过向

    http://mycouchdb:5984/test_db
我希望couchdb在哪里为我创建一个_id(参见示例:)

如果我按照文档进行操作(在本例中使用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
填充
\u id
。例如:

return [{_id : req.uuid, timestamp : new Date().getTime()}, 'created new doc'];
创建具有给定id的文档 所采用的路径是
!doc&&req.id
。这条路径是正确的

更新现有文档
所采用的路径是
doc
。您正确地选择了此路径。

是的,您可以使用更新处理程序执行此操作。您走的是正确的道路。以下是3种情况:

在不指定id的情况下创建文档 所采用的路径是
!doc&&!req.id
。 这就是您的示例。您不应该返回
null
,而应该构建一个新文档并返回它。您可以使用
req.uuid
填充
\u id
。例如:

return [{_id : req.uuid, timestamp : new Date().getTime()}, 'created new doc'];
创建具有给定id的文档 所采用的路径是
!doc&&req.id
。这条路径是正确的

更新现有文档
采取的路径是
doc
。你做对了这一条。

感谢Simon为我指明了正确的方向。这就是我最终使用的脚本

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”,其正文通过请求传入,以将新文档的内容添加到调用方提供的内容中。

感谢Simon为我指明了正确的方向。这就是我最终使用的脚本

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”“通过请求将新文档的内容添加到调用者提供的内容中来传递正文。

这几乎是正确的,但是
JSON.parse
应该优先于
eval
。Eval效率低下,并引入了安全问题。此外,当
doc
不是
null
时,也就是在
PUT
过程中,此代码将忽略对文档的任何更改,而只更新时间戳。这几乎是正确的,但
JSON。应该首选解析
eval
。Eval效率低下,并引入了安全问题。此外,当
doc
不是
null
时,即在
PUT
期间,此代码将忽略对文档的任何更改,但只更新时间戳。