2016-03-14 49 views
1

在R中處理MongoDB的包很多。我開始使用'mongolite'包,因爲我使用'jsonlite'和'mongolite'構建'jsonlite 」。然而,我有點困惑,爲什麼插入函數'mongolite'不允許插入JSON對象(幫助說插入數據框)?使用mongolite R包將json對象插入到MongoDB中

我應該使用什麼包來存儲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表示幕後的名爲BSON的二進制編碼格式的JSON文檔。 BSON延伸JSON模型以提供額外的數據類型和是有效的用於不同語言

內編碼和解碼

參考:JSON and BSON

+0

不幸的是,rmongodb不再適用於CRAN。但是,您的示例列表將如何加載呢?作爲兩個文件「foo」和「bar」,還是作爲一個大文件?在後一種情況下,在命令行上使用[mongoimport](https://docs.mongodb.com/manual/reference/program/mongoimport/)就可以實現。 – paulwasit

+0

@paulwasit'rmongodb'對於這種插入類型非常有用。這是一種恥辱,它不被支持 - 希望有人會接受它。或者,也許一個功能請求應該提交給'mongolite',這樣它可以插入更復雜的結構。 – SymbolixAU

相關問題