2016-03-14 2 views
1

Существует немало пакетов для работы с MongoDB в R. Я начал использовать пакет «mongolite», потому что я работаю с сборками «jsonlite» и «mongolite» поверх «jsonlite» ». Тем не менее, я немного озадачен, почему вставка функции в «mongolite» не позволяет вставлять json-объекты (в подсказке говорится, что она вставляет dataframes)?Вставка объекта json в MongoDB с использованием пакета mongolite R

Какой пакет следует использовать для хранения объектов json и выполнения простых запросов?

ответ

3

Если вы используете 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

+0

К сожалению, rmongodb больше не доступен на CRAN. Но как бы ваш список примеров был бы загружен в любом случае? Как два документа «foo» и «bar», или как один массивный документ? В последнем случае использование [mongoimport] (https://docs.mongodb.com/manual/reference/program/mongoimport/) в командной строке сделает трюк. – paulwasit

+0

@paulwasit 'rmongodb' был очень полезен для этого типа вставки. Жаль, что это не поддерживается - надеюсь, кто-то это воспримет. Или, возможно, запрос функции должен быть отправлен на «монголит», чтобы он мог вставлять более сложные структуры. – SymbolixAU

1

Разрабатываемая версия mongolite теперь поддерживает вставки вложенных списков или JSON непосредственно, см https://github.com/jeroenooms/mongolite/issues/42

Вы также можете запросить и вернуть вложенный список, используя m$iterate() или m$iterate()$batch().

+0

Спасибо за хедз-ап; начнет играть с версией разработки – SymbolixAU

Смежные вопросы