Если вы используете jsonlite
вы все еще можете использовать mongolite
для вставки данных, но только если она также может быть принужден к data.frame
(с использованием fromJSON
). Например:
js <- '[
{
"id": 1,
"val": "a"
},
{
"id": 2,
"val": "b"
},
{
"id": 3,
"val": "c"
}
] '
library(jsonlite)
library(mongolite)
mongo <- mongo(collection = "test", db = "test", url = "mongodb://localhost",
verbose = TRUE)
mongo$insert(fromJSON(js))
# Complete! Processed total of 3 rows.
# [1] TRUE
Однако мое понимание, что mongolite
пакет только вставить data.frames
. Например, принимая более сложную JSON
структуру, которую вы увидите, что мы не можем вставить его с помощью mongolite
js <- '{"foo":[{"id":1,"val":"a"},{"id":2,"val":"b"},{"id":3,"val":"c"}],"bar":[[{"id":1,"val":"a"},{"id":2,"val":"b"},{"id":3,"val":"c"}]]}'
## if we try to insert this using mongolite we get an error
## because it is not a data.frame
> mongo$insert(fromJSON(js))
Error: is.data.frame(data) is not TRUE
Чтобы вставить более сложную структуру JSON
мы можем использовать функцию mongo.bson.from.json
из rmongodb
пакета
library(rmongodb)
mongo <- mongo.create()
mongo.is.connected(mongo)
# [1] TRUE
db <- "test"
coll <- "test"
bs <- mongo.bson.from.JSON(js)
mongo.insert(mongo, ns = paste0(db ,".", coll), b = bs)
# [1] TRUE
Принимая во внимание, что на самом деле mongodb
хранит BSON:
MongoDB представляет собой документы JSON в двоично-кодированном формате BSON за кулисами. BSON расширяет модель JSON, чтобы предоставить дополнительные типы данных и быть эффективным для кодирования и декодирования в различных языках
Ссылка: JSON and BSON
К сожалению, rmongodb больше не доступен на CRAN. Но как бы ваш список примеров был бы загружен в любом случае? Как два документа «foo» и «bar», или как один массивный документ? В последнем случае использование [mongoimport] (https://docs.mongodb.com/manual/reference/program/mongoimport/) в командной строке сделает трюк. – paulwasit
@paulwasit 'rmongodb' был очень полезен для этого типа вставки. Жаль, что это не поддерживается - надеюсь, кто-то это воспримет. Или, возможно, запрос функции должен быть отправлен на «монголит», чтобы он мог вставлять более сложные структуры. – SymbolixAU