Используйте Rs mongolite, чтобы правильно (вставить? Обновить?) Добавить данные в существующую коллекцию - PullRequest
0 голосов
/ 06 октября 2018

У меня есть следующая функция, написанная на R, которая (я думаю) выполняет плохую работу по обновлению моих коллекций баз данных Монго.

library(mongolite) 

con <- mongolite::mongo(collection = "mongo_collection_1", db = 'mydb', url = 'myurl')
myRdataframe1 <- con$find(query = '{}', fields = '{}')
rm(con)

con <- mongolite::mongo(collection = "mongo_collection_2", db = 'mydb', url = 'myurl')
myRdataframe2 <- con$find(query = '{}', fields = '{}')
rm(con)

... code to update my dataframes (rbind additional rows onto each of them) ...

# write dataframes to database
write.dfs.to.mongodb.collections <- function() {

  collections <- c("mongo_collection_1", "mongo_collection_2") 
  my.dataframes <- c("myRdataframe1", "myRdataframe2")

  # loop dataframes, write colllections
  for(i in 1:length(collections)) {

    # connect and add data to this table
    con <- mongo(collection = collections[i], db = 'mydb', url = 'myurl')
    con$remove('{}')
    con$insert(get(my.dataframes[i]))
    con$count()

    rm(con)
  }
}
write.dfs.to.mongodb.collections()

Мои фреймы данных myRdataframe1 и myRdataframe2 - это очень большие фреймы данных, в настоящее время ~ 100K строк и ~ 50 столбцов.Каждый раз, когда запускается мой скрипт, он:

  • использует con $ find ('{}'), чтобы вытащить коллекцию mongodb в R, сохраненную как фрейм данных myRdataframe1
  • данные от поставщика данных, которые добавляются как новые строки к myRdataframe1
  • , используют con $ remove () и con $ insert для полного удаления данных в коллекции mongodb, а затем повторного-вставить всю myRdataframe1

Эта последняя точка пуля ненадежна, потому что я ежедневно запускаю этот скрипт R в cronjob, и мне это не нравится каждый раз, когда я полностью вытираю коллекцию mongo dbи повторно вставьте в коллекцию R-кадр данных.

Если я удалю строку con $ remove (), я получу сообщение об ошибке, в котором говорится, что у меня есть дубликаты ключей _id.Похоже, я не могу просто добавить, используя con $ insert ().

Любые мысли по этому поводу очень ценятся!

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

вы можете использовать upsert (который сопоставляет документ с первым условием, если обнаружит, что он обновит его, если нет, он вставит новое, сначала вам нужно отделить id от каждого документа

 _id= my.dataframes[i]$_id
 updateData = my.dataframes[i]
 updateData$_id <- NULL

, затемиспользуйте upsert (может быть более простой способ объединения строк в R)

 con$update(paste('{"_id":"', _id, '"}' ,sep="" ) , paste('{"$set":', updateData,'}', sep=""), upsert = TRUE)
0 голосов
/ 15 октября 2018

Когда вы пытаетесь вставить в MongoDB документы, которые уже существуют в базе данных в соответствии с их первичным ключом, вы получите исключение повторяющегося ключа.Чтобы обойти это, вы можете просто сбросить столбец _id, используя что-то вроде этого до con$insert:

my.dataframes[i]$_id <- NULL

Таким образом, недавно вставленный документ автоматически получит новый _id назначенный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...