Python 如何向CouchDB中创建的每个新文档添加字段
我知道有两个类似的问题(比如这一个:)在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数据库中创建新文档时,我都想添加一个时间戳
- 我在_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
期间,此代码将忽略对文档的任何更改,但只更新时间戳。