2

在 R 中有很多用于处理 MongoDB 的包。我开始使用“mongolite”包,因为我使用“jsonlite”和“mongolite”构建在“jsonlite”之上。但是,我有点困惑,为什么'mongolite'中的插入函数不允许插入json对象(帮助说它插入数据帧)?

我应该使用什么包来存储 json 对象并进行简单查询?

4

2 回答 2

5

如果你使用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 和 BSON

于 2016-03-14T08:42:30.140 回答
1

mongolite的开发版现在支持直接插入嵌套列表或者json,见https://github.com/jeroenooms/mongolite/issues/42

m$iterate()您还可以使用or查询和取回嵌套列表m$iterate()$batch()

于 2016-09-25T04:11:41.170 回答