R: Обновление записи в mongodb с использованием mongolite

у меня естьmongo база данных с информацией, которую я передаю некоторымR скрипты для анализа. В настоящее время я используюmongolite пакет для передачи информации отmongo вR.

У меня есть поле в каждой записи монго называетсяcheckedByR, который является двоичным, который указывает, была ли запись проанализированаR скрипты уже. В частности, я собираю запись монго по соответствующему идентификатору монго, запускаю сценарии для записи, присваиваю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 поле.

Я понимаю, чтоupdate функция существует вmongolite пакет (пожалуйста, обратите внимание:https://cran.r-project.org/web/packages/mongolite/mongolite.pdf), но у меня возникают проблемы со сбором соответствующих примеров, которые помогут мне завершить процесс обновления.

Любая помощь будет принята с благодарностью.

Ответы на вопрос(1)

mongo$update() функция занимаетquery иupdate аргумент. Вы используете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 документирование для получения дополнительной информации

Ваш ответ на вопрос