У меня есть приложение базы данных MEAN с несколькими коллекциями Mongo с иерархическими отношениями через ObjectId. Копия приложения работает локально в автономном режиме, а другая копия работает на производственном сервере.

Данные содержат в совокупности описание правил и содержимого, которые управляют сложным процессом. Эти данные необходимо вводить в автономном режиме, чтобы эти процессы можно было протестировать, прежде чем данные попадут в производственную среду.

Я предполагал, что смогу легко экспортировать выбранные документы как JSON, а затем относительно просто импортировать их в производственную базу данных. Таким образом, в системе будет большая кнопка «Экспорт», которая будет брать текущий документ, все вложенные и связанные документы и экспортировать их как один файл JSON. Затем моя кнопка «Импорт» проанализирует этот файл JSON на рабочем сервере.

Так что с экспортом проблем нет. Сделал это за пару часов.

Но я быстро обнаружил, что при импорте документа значение поля _id не сохраняется. Очевидно, это разрывает отношения.

Я подумал о написании процедур синтаксического анализа, которые сохраняли бы эти отношения, программно устанавливая ObjectIds в родительских документах после того, как дочерние документы были сохранены. Однако это будет огромной головной болью.

Я надеюсь, что есть либо: а) ... простой способ импортировать документ JSON с неповрежденными полями _id, или ... б) ... другой способ сделать это полностью, что проще, чем я делаю.

Я ценю любые советы.

2
Foswick 18 Фев 2016 в 00:08

2 ответа

Лучший ответ

Всегда должен быть кто-то, кто не знает ответа, кто жалуется на вопрос. Вопрос ясен, проблема знакома.

Действительно, Mongoose перезапишет любое значение, указанное вами для _id, когда вы создаете документ либо с помощью метода create (), либо с помощью конструктора (var thing = new Thing ()).

Кроме того, mongoexport / mongoimport не восполнит необходимость делать это программно, по крайней мере, с трудом.

Если я правильно понимаю, вы хотите экспортировать подмножество документов вместе со всеми связанными документами, сохранив ссылки в неизменном виде. Затем вы хотите импортировать эти данные в удаленную систему, опять же, сохраняя ссылки нетронутыми.

Подход, который вы выбрали, будет работать нормально, но, как вы выяснили, он уничтожит все ссылки.

Я работал над подобной проблемой и считаю, что лучший способ сделать это - делать то, чего, похоже, вы хотели избежать. То есть вы будете перебирать свои коллекции и позволить Mongo генерировать свои _ids по своему усмотрению. Сначала добавьте дочерние документы, а затем правильно установите ссылки в родительских документах. Я действительно не думаю, что есть лучший способ, который по-прежнему дает вам детальный контроль.

0
Faris 18 Фев 2016 в 06:19

В текущей версии mongodb вы можете использовать db.copyDatabase (). Запустите текущий экземпляр mongodb, в который вы хотите скопировать базу данных, и выполните следующую команду:

db.copyDatabase(fromDB, toDB).

Дополнительные параметры и подробности см. В db.copyDatabase ()

0
Sachin 13 Сен 2016 в 17:32