R Как сделать POST-запрос к MongoDB - PullRequest
0 голосов
/ 23 ноября 2018

В настоящее время я работаю с данными из онлайн-базы данных.Я получаю доступ к данным через API, который работает, когда я получаю все данные одновременно.Но это замедляет работу моей системы, поэтому я хочу сделать запрос только для отфильтрованных данных (чего я не делал до сих пор).Это способ получить весь набор данных:

#-------------------------------#
#          packages             #
#-------------------------------#
library(httr)
library(jsonlite)

#-------------------------------#
#         API requests          #
#-------------------------------#

##  get all data at once  ##
url <- "https://www.eter-project.com/api/3.0/HEIs/full"
raw_result <- GET(url)

#-------------------------------#
#       data processing         #
#-------------------------------#

# 'status_code' (if request worked) and 'content' (APIs answer) important
names(raw_result) 

# '200' tells us that server received request
raw_result$status_code 

# translate Unicode into text
this.raw.content <- rawToChar(raw_result$content) 

# transform json into workable format for R
mydata <- fromJSON(this.raw.content, flatten = TRUE) 

class(mydata)
dim(mydata)

Согласно документации (https://www.eter -project.com / api / doc / # / ) мне нужен запрос POSTиспользуя url https://www.eter-project.com/api/3.0/HEIs/query и фильтр, встроенный в следующую структуру:

{
 "filter": {},
  "fieldIds": {}
}

Я хочу фильтровать по годам и странам, чтобы получать только те данные, с которыми я в данный момент хочу работать.Структура фильтра будет выглядеть следующим образом: { "BAS.REFYEAR.v": 2011, "BAS.COUNTRY.v": "AT"}.

Кто-нибудь знает, как я могу реализовать это в запросе POST?

До сих пор я предпринял несколько отчаянных попыток включить фильтр.в запросы POST (например, raw_result <- POST(url, body = list({ "filter": {"BAS.REFYEAR.v" = 2011}}), encode = "json") и игра с пакетом mongolite, который даже близко не был.

ОБНОВЛЕНИЕ: проблема фильтрации была решена. Я использовал следующее решение:

myquery <- '{
  "filter": {"BAS.REFYEAR.v": 2015, "BAS.COUNTRY.v": "LV"},
  "fieldIds": {},
  "searchTerms": []
  }'

url <- "https://www.eter-project.com/api/3.0/HEIs/query"

raw_result <- POST(url, body = myquery, content_type_json())

Теперь я столкнулся с другой проблемой: данные содержат много специальных символов, которые неправильно отображаются в R (например, Alberta koledža в наборе данных отображается как Alberta koledžain R). Есть ли способ решить эту проблему?Например, используя UTF-8 в запросе вызова?

1 Ответ

0 голосов
/ 23 ноября 2018

Вы можете попытаться создать требуемый JSON в виде списка списков.Однако я считаю, что проще предоставить JSON явно и добавить тип контента вручную:

query <- '{
  "filter": { "BAS.REFYEAR.v": 2011,  "BAS.COUNTRY.v": "AT"},
  "fieldIds": {},
  "searchTerms": []
}'
url <- "https://www.eter-project.com/api/3.0/HEIs/query"
raw_result <- httr::POST(url = url, body = query, content_type_json())

После этого вы можете применить свою обработку, как и раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...