Создание дизайнерских документов 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);
}

И обратно в РИ можно получить результаты просмотра:

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 ответ

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

{
   "_id": "_design/foodview",
   "views": {
     "foodview": {
       "map": "function(doc) {emit(doc.day, doc.dinner);}"
     }
   }
}
Другие вопросы по тегам