在R中處理MongoDB的包很多。我開始使用'mongolite'包,因爲我使用'jsonlite'和'mongolite'構建'jsonlite 」。然而,我有點困惑,爲什麼插入函數'mongolite'不允許插入JSON對象(幫助說插入數據框)?使用mongolite R包將json對象插入到MongoDB中
我應該使用什麼包來存儲json對象並執行簡單查詢?
在R中處理MongoDB的包很多。我開始使用'mongolite'包,因爲我使用'jsonlite'和'mongolite'構建'jsonlite 」。然而,我有點困惑,爲什麼插入函數'mongolite'不允許插入JSON對象(幫助說插入數據框)?使用mongolite R包將json對象插入到MongoDB中
我應該使用什麼包來存儲json對象並執行簡單查詢?
如果使用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模型以提供額外的數據類型和是有效的用於不同語言
內編碼和解碼
mongolite的發展版本現在支持直接插入嵌套列表或JSON,見https://github.com/jeroenooms/mongolite/issues/42
您還可以使用m$iterate()
或m$iterate()$batch()
查詢並獲取嵌套列表。
感謝您的提醒;將開始玩開發版 – SymbolixAU
不幸的是,rmongodb不再適用於CRAN。但是,您的示例列表將如何加載呢?作爲兩個文件「foo」和「bar」,還是作爲一個大文件?在後一種情況下,在命令行上使用[mongoimport](https://docs.mongodb.com/manual/reference/program/mongoimport/)就可以實現。 – paulwasit
@paulwasit'rmongodb'對於這種插入類型非常有用。這是一種恥辱,它不被支持 - 希望有人會接受它。或者,也許一個功能請求應該提交給'mongolite',這樣它可以插入更復雜的結構。 – SymbolixAU