首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:使用mongolite更新mongodb中的条目

R:使用mongolite更新mongodb中的条目
EN

Stack Overflow用户
提问于 2016-06-04 23:30:09
回答 1查看 4.5K关注 0票数 8

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

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

为了完整性,我使用以下请求查询数据库:

代码语言:javascript
复制
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),但我在收集相关示例以帮助我完成更新过程时遇到了麻烦。

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2016-06-06 19:02:29

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

考虑这个例子

代码语言:javascript
复制
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上,因此下面的代码将无法工作

对于更复杂的结构和更新,你可以这样做

代码语言:javascript
复制
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文档

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37631954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档