【问题标题】:Creating CouchDB design documents from R从 R 创建 CouchDB 设计文档
【发布时间】:2013-06-25 14:58:04
【问题描述】:

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

【问题讨论】:

    标签: r couchdb rcurl rjsonio


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。这解决了问题的第一部分。现在我也只需要得到 R 部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多