Как переместить поля данных из всех документов одной коллекции в новые документы другой коллекции?

Моя ситуация: я создал приложение Mongo (mongoose), Express и Node, и теперь, когда я создаю дополнительные функции, я понял, что мои модели не будут обрабатывать новые функции, поэтому я создал новая модель, рассчитанная на будущее, но мне нужно переместить некоторые поля данных из моей старой модели User в мою новую модель List.

Каков наилучший способ перемещения данных документа из всех определенных полей в одной коллекции документов в новый документ в новой коллекции? Могу ли я создать сценарий с помощью JavaScript и запустить его на моем сервере или базе данных?

Я не хочу нарушать работу моих пользователей, если это возможно. Кроме того, я знаю, что существует метод db.collection.update, но мне нужно перемещать все эти данные одновременно, а не всякий раз, когда я запускаю этот метод в своем приложении.


person Chris Johnson    schedule 16.11.2017    source источник


Ответы (1)


Вы можете написать его разными способами, но, вероятно, проще всего:

  1. Используйте aggregate с $out в конце конвейера для заполнения новой коллекции из исходных документов. Используйте этап конвейера $project, чтобы структурировать выходные документы как желанный.
  2. Используйте updateMany в исходной коллекции, чтобы удалить "перемещенные " с помощью оператора $unset.

В зависимости от специфики вашей системы вам все равно может понадобиться перевести пользователей в автономный режим, пока вы делаете это.

person JohnnyHK    schedule 16.11.2017
comment
Я прочитал документацию по этому вопросу, и это кажется правильным решением, но у меня есть вопрос: как использовать $out для перемещения данных в новую модель, список, коллекцию, если я еще не использовал модель, что означает, что коллекция в настоящее время не существует. Я хочу убедиться, что при перемещении всех этих данных они будут в той же коллекции, когда я начну использовать свою новую модель List. - person Chris Johnson; 19.11.2017
comment
Правильный ответ! - person Chris Johnson; 19.11.2017