【问题标题】:Inserting json object into MongoDB using mongolite R package使用mongolite R包将json对象插入MongoDB
【发布时间】:2016-06-29 00:43:00
【问题描述】:

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

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

【问题讨论】:

    标签: json r mongodb mongolite


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的提醒;将开始玩开发版
    【解决方案2】:

    如果您使用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 在后台以称为 BSON 的二进制编码格式表示 JSON 文档。 BSON 扩展了 JSON 模型以提供额外的数据类型并在不同语言中高效地进行编码和解码

    参考:JSON and BSON

    【讨论】:

    • 不幸的是,rmongodb 在 CRAN 上不再可用。但是无论如何将如何加载您的示例列表?作为两个文件“foo”和“bar”,还是作为一个大文件?在后一种情况下,在命令行上使用mongoimport 就可以了。
    • @paulwasit rmongodb 对于这种类型的插入非常有用。很遗憾它没有得到支持 - 希望有人会接管它。或者,也许应该将功能请求提交给mongolite,以便它可以插入更复杂的结构。
    猜你喜欢
    • 2018-01-18
    • 2017-11-30
    • 1970-01-01
    • 2019-01-17
    • 2023-03-31
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    相关资源
    最近更新 更多