【问题标题】:R : Updating an entry in mongodb using mongoliteR:使用 mongolite 更新 mongodb 中的条目
【发布时间】:2023-03-31 01:55:01
【问题描述】:

我有一个mongo 数据库,其中包含我要传递给一些R 脚本进行分析的信息。我目前正在使用mongolite 包将信息从mongo 传递到R

我在每个 mongo 条目中都有一个名为 checkedByR 的字段,它是一个二进制文件,指示该条目是否已经被 R 脚本分析过。具体来说,我正在通过其各自的 mongo ID 收集一个 mongo 条目,在该条目上运行脚本,为 checkedByR 字段分配一个 1,然后继续。

为了完整起见,我正在使用以下请求查询数据库:

library(mongolite)

mongoID <- "1234abcd1234abcd1234"

m <- mongolite::mongo(url = "mongodb://localhost:27017",
                      collection = "collection",
                      db = "database")

rawData <- m$find(query = paste0('{"_id": { "$oid" : "',mongoID,'" }}'), 
                  fields = '{"_id" : 1, 
                             "checkedByR" : 1, 
                             "somethingToCheck" : 1}')

checkedByR <- 1

但是,我无法使用新的 checkedByR 字段成功更新 mongo 条目。

我知道mongolite 包中存在update 函数(请考虑:https://cran.r-project.org/web/packages/mongolite/mongolite.pdf),但我无法收集相关示例来帮助我完成更新过程。

任何帮助将不胜感激。

【问题讨论】:

    标签: r mongodb mongolite


    【解决方案1】:

    mongo$update() 函数接受 queryupdate 参数。您使用query 查找要更新的数据,并使用update 告诉它要更新哪个字段。

    考虑这个例子

    library(mongolite)
        
    ## create some dummy data and insert into mongodb
    df <- data.frame(id = 1:10,
      value = letters[1:10]
    )
        
    mongo <- mongo(collection = "another_test", 
      db = "test", 
      url = "mongodb://localhost")
        
    mongo$insert(df)
        
    ## the 'id' of the document I want to update
    mongoID <- "575556825dabbf2aea1d7cc1"
        
    ## find some data
    rawData <- mongo$find(query = paste0('{"_id": { "$oid" : "',mongoID,'" }}'), 
      fields = '{"_id" : 1, 
      "id" : 1, 
      "value" : 1}'
    )
        
    ## ...
    ## do whatever you want to do in R...
    ## ...
    
    ## use update to query on your ID, then 'set' to set the 'checkedByR' value to 1
    
    mongo$update(
      query = paste0('{"_id": { "$oid" : "', mongoID, '" } }'),
      update = '{ "$set" : { "checkedByR" : 1} }'
    )
    
    ## in my original data I didn't have a 'checkedByR' value, but it's added anyway
    

    更新

    rmongodb 库不再在 CRAN 上,因此下面的代码将不起作用


    对于更复杂的结构和更新,您可以执行以下操作

    library(mongolite)
    library(jsonlite)
    library(rmongodb)  ## used to insert a non-data.frame into mongodb
        
    ## create some dummy data and insert into mongodb
    lst <- list(id = 1,
      value_doc = data.frame(id = 1:5,
      value = letters[1:5],
      stringsAsFactors = FALSE),
      value_array = c(letters[6:10])
    )
        
    ## using rmongodb
    mongo <- mongo.create(db = "test")
    coll <- "test.another_test"
        
    mongo.insert(mongo, 
      ns = coll, 
      b = mongo.bson.from.list(lst)
    )
        
    mongo.destroy(mongo)
    
    ## update document with specific ID
    mongoID <- "5755f646ceeb7846c87afd90"
        
    ## using mongolite
    mongo <- mongo(db = "test", 
      coll = "another_test", 
      url = "mongodb://localhost"
    )
        
        
    ## to add a single value to an array
    mongo$update(
      query = paste0('{"_id": { "$oid" : "', mongoID, '" } }'),
      update = '{ "$addToSet" : { "value_array" :  "checkedByR"  } }'
    )
        
    ## To add a document  to the value_array
    mongo$update(
      query = paste0('{"_id": { "$oid" : "', mongoID, '" } }'),
      update = '{ "$addToSet" : { "value_array" : { "checkedByR" : 1} } }'
    )
        
    ## To add to a nested array
    mongo$update(
      query = paste0('{"_id": { "$oid" : "', mongoID, '" } }'),
      update = '{ "$addToSet" : { "value_doc.value" :  "checkedByR" } }'
    )
        
    rm(mongo); gc()
    

    查看mongodb update文档了解更多详情

    【讨论】:

      猜你喜欢
      • 2021-11-27
      • 2016-09-20
      • 2018-01-18
      • 2017-07-20
      • 2016-06-29
      • 1970-01-01
      • 2021-12-24
      • 2017-11-30
      • 1970-01-01
      相关资源
      最近更新 更多