Команда mongorestore заменяет существующие записи?

Есть ли способ, чтобы mongorestore заменил записи, существующие в базе данных, вместо того, чтобы пропускать его, что является поведением по умолчанию?

В настоящее время я использую самую последнюю версию mongodb версии 2.4.x.

Ответ 1

Нет. Из магазина

Если вы восстановите существующую базу данных, mongorestore будет только вставлять в существующую базу данных и не будет выполнять какие-либо обновления. Если существующие документы имеют одно и то же поле значения _id в целевой базе данных и коллекции, mongorestore не будет перезаписывать эти документы.

Если вы хотите полностью перезаписать базу данных или коллекцию в базе данных с помощью mongorestore, удалите базу данных или коллекцию (проверьте параметр --drop, как указано в ответе vikas). Если вы хотите заменить определенные документы или объединить дубликаты документов, то вам нужно написать собственный сценарий, чтобы выполнить восстановление и самостоятельно реализовать более сложную логику.

Ответ 2

Вы можете использовать параметр --drop mongorestore:

Перед восстановлением коллекций из сохраненной резервной копии удаляет коллекции из целевой базы данных. --drop не удаляет коллекции, которых нет в резервной копии.

Ответ 3

Если у вас есть небольшая коллекция, вы всегда можете:

  • mongodump ваша целевая коллекция где-то еще
  • удалить целевую коллекцию
  • mongorestore исходный файл дампа
  • mongorestore файл дампа, который вы сделали на шаге 1

Это переключает приоритет на файл дампа, а не на _ids в БД.

Ответ 4

mongorestore --drop

Перед восстановлением коллекций из сохраненной резервной копии удаляет коллекции из целевой базы данных. --drop не удаляет коллекции, которых нет в резервной копии.

Монго официальная документация

Ответ 5

Я решил это с помощью

  1. восстановить коллекцию и записать вывод в файл (ошибки)
mongorestore --db database -c collection ~/path_to_bson > output.txt 2>&1
  1. отфильтровать строки, содержащие - E11000 duplicate key error collection ...ObjectId(...)
  2. затем с помощью инструмента мультиредактирования (в моем случае возвышенного) преобразовать эти строки в db.collection.remove({_id: ObjectId(...)})
  3. восстановить базу данных снова.