2016-06-04 5 views
4

Ich habe eine mongo Datenbank mit Informationen, die ich an einige R Skripte für die Analyse übergeben. Ich verwende derzeit das mongolite Paket, um die Informationen von mongo an R zu übergeben.R: Aktualisieren eines Eintrags in Mongodb mit Mongolit

Ich habe ein Feld in jedem Mongo Eintrag namens checkedByR, die eine Binärdatei ist, die angibt, ob der Eintrag bereits von den R Skripten analysiert wurde. Genauer gesagt, sammle ich einen Mongo-Eintrag mit seiner entsprechenden Mongo-ID, führe die Skripte auf dem Eintrag aus, weise dem checkedByR-Feld eine 1 zu und gehe dann weiter.

Für Vollständigkeit, ich bin die Abfrage der Datenbank mit der folgenden Anforderung:

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 

jedoch Ich habe Probleme erfolgreich den Mongo Eintrag mit dem neuen checkedByR Feld zu aktualisieren.

Ich weiß, dass eine update Funktion im mongolite Paket vorhanden ist (bitte beachten: https://cran.r-project.org/web/packages/mongolite/mongolite.pdf), aber ich habe Probleme relevante Beispiele zu sammeln, mir zu helfen den Aktualisierungsvorgang abzuschließen.

Jede Hilfe würde sehr geschätzt werden.

Antwort

2

die mongo$update() Funktion nimmt eine query und eine update Argument. Sie verwenden die query, um die Daten zu finden, die Sie aktualisieren möchten, und die update, um es zu informieren, welches Feld zu aktualisieren ist.

Betrachten Sie dieses Beispiel

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 

Und für komplexere Strukturen & Updates Sie können Dinge wie

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() 

siehe mongodb update documemtation für weitere Details

Verwandte Themen