3

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

回到 RI 可以得到视图结果:

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"))
4

1 回答 1

2

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

{
   "_id": "_design/foodview",
   "views": {
     "foodview": {
       "map": "function(doc) {emit(doc.day, doc.dinner);}"
     }
   }
}
于 2013-06-25T15:21:43.580 回答