使用 mongolite R 包将 json 对象插入 MongoDB
Inserting json object into MongoDB using mongolite R package
在 R 中有很多处理 MongoDB 的包。我开始使用 'mongolite' 包,因为我使用 'jsonlite' 和 'mongolite' 构建在上面'jsonlite'。但是,我有点疑惑,为什么在 'mongolite' 中插入函数不允许插入 json 对象(帮助说它插入数据帧)?
我应该使用什么包来存储 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
结构,我们可以使用 rmongodb
包中的 mongo.bson.from.json
函数
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 represents JSON documents in binary-encoded format called BSON behind the scenes. BSON extends the JSON model to provide additional data types and to be efficient for encoding and decoding within different languages
mongolite开发版现在支持插入嵌套列表或直接json,见https://github.com/jeroenooms/mongolite/issues/42
您还可以使用 m$iterate()
或 m$iterate()$batch()
查询和取回嵌套列表。
在 R 中有很多处理 MongoDB 的包。我开始使用 'mongolite' 包,因为我使用 'jsonlite' 和 'mongolite' 构建在上面'jsonlite'。但是,我有点疑惑,为什么在 'mongolite' 中插入函数不允许插入 json 对象(帮助说它插入数据帧)?
我应该使用什么包来存储 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
结构,我们可以使用 rmongodb
包中的 mongo.bson.from.json
函数
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 represents JSON documents in binary-encoded format called BSON behind the scenes. BSON extends the JSON model to provide additional data types and to be efficient for encoding and decoding within different languages
mongolite开发版现在支持插入嵌套列表或直接json,见https://github.com/jeroenooms/mongolite/issues/42
您还可以使用 m$iterate()
或 m$iterate()$batch()
查询和取回嵌套列表。