Создание проектных документов CouchDB из R

Мне нужно создать дизайн-документы CouchDB из R, чтобы другие могли использовать мой код, не изучая и не переключаясь на CouchDB.

Эта ссылка была очень полезна для изучения того, как использовать CouchDB из R: 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 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, я создал новые строки записи, которые создают представление, которое можно проанализировать с помощью 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"))

person Chris    schedule 25.06.2013    source источник


Ответы (1)


Чтобы создать представление на CouchDB, вам нужно создать новый или обновить существующий дизайн-документ, а не просто поместить код функции. Я не знаю R, чтобы написать немного кода, но для создания нового документа дизайна с вашим представлением вам нужно отправить следующий JSON, а не просто просмотреть код функции:

{
   "_id": "_design/foodview",
   "views": {
     "foodview": {
       "map": "function(doc) {emit(doc.day, doc.dinner);}"
     }
   }
}
person Kxepal    schedule 25.06.2013
comment
Спасибо. Это решило первую часть проблемы. Теперь мне просто нужно получить R-часть тоже. - person Chris; 25.06.2013