从R创建CouchDB设计文档

时间:2013-06-25 14:58:04

标签: r couchdb rcurl rjsonio

我需要从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"))

1 个答案:

答案 0 :(得分:2)

要在CouchDB上创建视图,您需要创建新的或更新现有的设计文档,而不仅仅是放置功能代码。我不知道R写了一些代码,但是要用你的视图创建新的设计文档,你需要发送下一个JSON而不仅仅是查看函数代码:

{
   "_id": "_design/foodview",
   "views": {
     "foodview": {
       "map": "function(doc) {emit(doc.day, doc.dinner);}"
     }
   }
}