我需要从R创建CouchDB设计文档,以便其他人可以使用我的代码而无需学习或切换到CouchDB。
此链接对于学习如何使用R中的CouchDB非常有用:http://digitheadslabnotebook.blogspot.com/2010/10/couchdb-and-r.html。接下来我可以制作并填写数据库:
library(RJSONIO)
library(RCurl)
httpPUT("http://127.0.0.1:5984/fooddb") # Creates the fooddb database
# Add two documents
fromJSON(getURL("http://127.0.0.1:5984/fooddb", customrequest='POST', httpheader=c('Content-Type'='application/json'), postfields=toJSON(list(day="Monday", dinner="Pasta"))))
fromJSON(getURL("http://127.0.0.1:5984/fooddb", customrequest='POST', httpheader=c('Content-Type'='application/json'), postfields=toJSON(list(day="Tuesday", dinner="Soup"))))
在CouchDB web-gui Futon中,我手动创建了这个视图(这是我想从R做的步骤)。
function(doc) {
emit(doc.day, doc.dinner);
}
回到R我可以得到视图结果:
view.results <- fromJSON(httpGET("http://127.0.0.1:5984/fooddb/_design/fooddoc/_view/foodview"))
view.results.df <- do.call(rbind.data.frame, view.results$rows)
colnames(view.results.df) <- c("key", "day", "dinner")
要从R创建视图,我将视图保存到文件并尝试将其放入CouchDB
writeLines(toJSON("function(doc) {
emit(doc.day, doc.dinner);
}"),
"foodview.json")
fromJSON(getURL("http://127.0.0.1:5984/fooddb/_design/foodview", customrequest='PUT', httpheader=c('Content-Type'='application/json'), postfields="@foodview.json"))
但结果是(“bad_request”“invalid_json”)。
有什么不对?我怀疑最后一行或“writeLines”命令,但还没有找到让它们工作的方法。
更新:基于Kxepals的好答案,我创建了一个新的writeLines,创建了一个可以用curl解析的视图。
writeLines("{
\"_id\": \"_design/foodview\",
\"views\": {
\"foodview\": {
\"map\": \"function(doc) {emit(doc.day, doc.dinner);}\"
}
}
}"
, "foodview.json")
但是以下行仍然会出现同样的错误。现在我确定错误就在这一行。
fromJSON(getURL("http://127.0.0.1:5984/fooddb/_design/foodview", customrequest='PUT', httpheader=c('Content-Type'='application/json'), postfields="@foodview.json"))
答案 0 :(得分:2)
要在CouchDB上创建视图,您需要创建新的或更新现有的设计文档,而不仅仅是放置功能代码。我不知道R写了一些代码,但是要用你的视图创建新的设计文档,你需要发送下一个JSON而不仅仅是查看函数代码:
{
"_id": "_design/foodview",
"views": {
"foodview": {
"map": "function(doc) {emit(doc.day, doc.dinner);}"
}
}
}