Принятый ответ, возможно, был лучшим методом еще в 2012 году, но теперь db.cloneCollection () часто является лучшим решением. Здесь есть несколько недавних ответов, которые относятся к этому, поэтому, если вы пришли сюда из Google (как я), посмотрите на все ответы!
Кельвин
4
Обязательно прочитайте и другие ответы, хотя и убедитесь, что они соответствуют вашим потребностям, а не только @kelvin в его / ее ситуации
Обратите внимание, что если вы копируете в оболочку JS, документы BSON декодируются в JSON во время процесса, поэтому некоторые документы могут подвергаться изменениям типа. mongodump / mongorestore, как правило, лучший подход.
Стенни
1
Согласовано. Это было больше, чем просто забавное предложение поиграться с раковиной. Плюс, это не принесло бы индексы. Если бы я делал это, я бы делал mongodump / mongorestore каждый раз.
Джейсон Маккей
2
Спасибо. Обратите внимание, что в коде есть опечатка, не закрывающая функцию getSiblingDB. Вот исправленный код: db. <Collection_name> .find (). ForEach (function (d) {db.getSiblingDB ('<new_database>') ['<collection_name>']. Insert (d);});
Флавиу
1
это хорошо работало для сброса тестового mongodb из золотой копии между тестовыми прогонами. вместо жесткого кодирования имен коллекций вы можете выполнить цикл for для всех имен коллекций, которые хотите скопировать, с помощью db.getCollection (name) .find (). forEach и предоставить функцию, имеющую db.getSiblingDB ("otherdb"). getCollection (имя) .Вставьте (д).
simbo1905
2
это эффективно для коллекций огромных размеров?
Халил Авада
284
Лучше всего сделать mongodump, а затем mongorestore.
Вы можете выбрать коллекцию через:
mongodump -d some_database -c some_collection
[При желании, заархивировать дамп ( zip some_database.zip some_database/* -r) и scpэто в другом месте]
Существующие данные в some_or_other_collectionбудут сохранены. Таким образом, вы можете «добавить» коллекцию из одной базы данных в другую.
До версии 2.4.3 вам также нужно будет добавить свои индексы после копирования ваших данных. Начиная с 2.4.3, этот процесс является автоматическим, и вы можете отключить его с помощью --noIndexRestore.
Кажется, что mongodump не работает, если у вас есть защищенный паролем экземпляр mongo (и вы должны!)
Лучано Камило
3
Он работает на БД с защитой PW, вам просто нужно передать auth в параметрах
Ben
2
Это намного быстрее, чем find / forEach / insert, в моем случае 2 минуты против 2 часов
Juraj Paulo
Введите имя пользователя для базы данных с параметром --username, но не --password, чтобы получить запрос на ввод пароля. Лучше всего не вводить пароль в командную строку (в конечном итоге сохранить его в .bash_history или аналогичном)
Chanoch
Minor: Я нашел файл в подкаталоге с именем , some_database так это работает для меня: mongorestore -d -c some_other_db some_or_other_collection дамп / some_database / some_collection.bson
Aviko
88
На самом деле, это команда , чтобы переместить коллекцию из одной базы данных в другую. Это просто не называется «переместить» или «скопировать».
Чтобы скопировать коллекцию, вы можете клонировать ее на том же БД, а затем переместить клон.
Клонировать:
> use db1
> db.source_collection.find().forEach(function(x){db.collection_copy.insert(x)});
Двигаться:
> use admin
switched to db admin
> db.runCommand({renameCollection:'db1.source_collection', to:'db2.target_collection'})// who'd think rename could move?
Другие ответы лучше для копирования коллекции, но это особенно полезно, если вы хотите переместить его.
Thx отлично работает! Просто нужен заключительный апостроф в'db1.source_collection'
andrrs
4
Вместо «использовать администратор» следует «db.runCommand (...». Вы можете сделать только одну команду, «db.adminCommand (...»
Хамид,
25
Я бы злоупотребил функцией подключения в Mongo Cli Mongo Doc . так что это означает, что вы можете установить одно или несколько соединений. если вы хотите скопировать коллекцию клиентов из test в test2 на том же сервере. сначала вы начинаете монго оболочки
use test
var db2 = connect('localhost:27017/test2')
сделать нормальный поиск и скопировать первые 20 записей в test2.
просто измените localhost на IP или имя хоста для подключения к удаленному серверу. Я использую это для копирования тестовых данных в тестовую базу данных для тестирования.
Как я прокомментировал предложение Джейсона, имейте в виду, что если вы копируете в оболочку JS, документы BSON декодируются в JSON во время процесса, поэтому некоторые документы могут подвергаться изменениям типа. Есть ограничения, аналогичные ограничениям eval, и это будет более медленный процесс копирования значительных объемов данных между базами данных (особенно на одном сервере). Итак, монгодумп / монгорестор FTW :).
Стенни
19
Если между двумя удаленными экземплярами Mongod, используйте
Поле copyIndexesопций на самом деле не соблюдается. Индексы всегда копируются. См. SERVER-11418
Джанфранко П.
6
Оберните это в db.runCommand (), т.е. db.runCommand ({cloneCollection: "<collection>", from: "<hostname>", query: {<query>}})
Даниэль де Цваан,
Как это можно использовать для инкрементных обновлений с одного удаленного монго на другое?
18:18
У меня есть пользовательские данные, добавленные к одному экземпляру Монго в течение дня. В конце дня мне нужно перенести вновь добавленные строки в другой экземпляр Монго. Как этого достичь?
18:00
@NishantKumar попробуйте установить в запросе: {} этот код: $ where: function () {today = new Date (); // today.setHours (0,0,0,0); возврат (this._id.getTimestamp ()> = сегодня). См. Stackoverflow.com/questions/42456375/… .
es одеколон
18
Я бы обычно делал:
use sourcedatabase;var docs=db.sourcetable.find();
use targetdatabase;
docs.forEach(function(doc){ db.targettable.insert(doc);});
это намного лучше, эффективнее, с меньшими затратами, работает для любого размера набора данных.
Джереми
Если вы делаете это с более чем 300k записями, вам может потребоваться добавить .limit (300000) после поиска и перед foreach. В противном случае система может заблокироваться. Я обычно ограничиваю массовые изменения до 100 КБ для безопасности. Оборачивание всего этого в цикл for на основе количества и предела.
триненатура
6
Вы можете использовать структуру агрегации, чтобы решить вашу проблему
Я знаю, что на этот вопрос был дан ответ, однако я лично не буду отвечать @JasonMcCays из-за того, что курсоры передаются в потоковом режиме, и это может вызвать бесконечный цикл курсора, если коллекция все еще используется. Вместо этого я бы использовал снимок ():
Ответ @bens также хорош и хорошо работает для горячих резервных копий коллекций не только потому, что mongorestore не нужно использовать один и тот же mongod.
Это может быть просто особый случай, но для коллекции документов размером 100 тыс. С двумя случайными строковыми полями (длина составляет 15-20 символов) использование тупого mapreduce почти в два раза быстрее, чем find-insert / copyTo:
db.coll.mapReduce(function(){ emit(this._id,this);},function(k,vs){return vs[0];},{ out :"coll2"})
это займет много времени, если размер данных огромен. В качестве альтернативы вы можете использовать bulk_insert
nishant
1
Да, это был быстрый и грязный способ, который я нашел для себя, моя база данных была не слишком большой, но и не маленькой, и не заняла слишком много времени, но да, вы правы.
Вбхакта
2
Это не решит вашу проблему, но оболочка mongodb имеет copyToметод, который копирует коллекцию в другую в той же базе данных :
db.mycoll.copyTo('my_other_collection');
Он также переводит с BSON в формате JSON, поэтому mongodump/ mongorestoreлучший путь, как уже говорили другие.
Превосходно. К сожалению, ссылка на оболочку Mongo не упоминает этот метод.
pgl
Да, я знаю, но оболочка MongoDB великолепна, если вы введете db.collname. [TAB] вы увидите все доступные методы для объекта коллекции. этот совет работает для всех других объектов.
Роберто
Проблема заключается в отсутствии помощи для этих команд! Полезно иметь возможность видеть код, хотя, пропуская символы в вызове метода.
2013 г.
2
К сожалению, эта команда устарела с версии 3.0.
Гарри
2
Если оперативная память не является проблемой, использование insertManyпроисходит быстрее, чем forEachзацикливание.
В случае, если некоторые пользователи heroku спотыкаются здесь и, как я, хотят скопировать некоторые данные из промежуточной базы данных в рабочую базу данных или наоборот, вот как вы делаете это очень удобно (NB. Я надеюсь, что там нет опечаток, не могу проверить это, атм., Я постараюсь подтвердить правильность кода как можно скорее):
to_app="The name of the app you want to migrate data to"
from_app="The name of the app you want to migrate data from"
collection="the collection you want to copy"
mongohq_url=`heroku config:get--app "$to_app" MONGOHQ_URL`
parts=(`echo $mongohq_url | sed "s_mongodb://heroku:__"| sed "s_[@/]_ _g"`)
to_token=${parts[0]}; to_url=${parts[1]}; to_db=${parts[2]}
mongohq_url=`heroku config:get--app "$from_app" MONGOHQ_URL`
parts=(`echo $mongohq_url | sed "s_mongodb://heroku:__"| sed "s_[@/]_ _g"`)
from_token=${parts[0]}; from_url=${parts[1]}; from_db=${parts[2]}
mongodump -h "$from_url"-u heroku -d "$from_db"-p"$from_token"-c "$collection"-o col_dump
mongorestore -h "$prod_url"-u heroku -d "$to_app"-p"$to_token"--dir col_dump/"$col_dump"/$collection".bson -c "$collection"
Вы всегда можете использовать Robomongo. Начиная с версии 0.8.3 существует инструмент, который может сделать это, щелкнув правой кнопкой мыши коллекцию и выбрав «Копировать коллекцию в базу данных».
Эта особенность Robomongo все еще нестабильна. Это 50/50 шанс заставить его работать.
thedp
2
Это, кажется, было удалено из 0.8.5
Carasel
0
В моем случае мне пришлось использовать подмножество атрибутов из старой коллекции в моей новой коллекции. В итоге я выбрал эти атрибуты при вызове insert для новой коллекции.
используйте «Studio3T for MongoDB» с инструментами «Экспорт» и «Импорт», щелкнув ссылку на базу данных, коллекцию или ссылку для загрузки конкретной коллекции: https://studio3t.com/download/
Ответы:
На данный момент в MongoDB нет команды, которая бы это делала. Обратите внимание на билет JIRA с соответствующим запросом .
Вы могли бы сделать что-то вроде:
Обратите внимание, что для этого две базы данных должны будут использовать один и тот же mongod, чтобы это работало.
Кроме того, вы можете создать mongodump коллекции из одной базы данных, а затем сохранить коллекцию в другой базе данных.
источник
Лучше всего сделать mongodump, а затем mongorestore.
Вы можете выбрать коллекцию через:
[При желании, заархивировать дамп (
zip some_database.zip some_database/* -r
) иscp
это в другом месте]Затем восстановите это:
Существующие данные в
some_or_other_collection
будут сохранены. Таким образом, вы можете «добавить» коллекцию из одной базы данных в другую.До версии 2.4.3 вам также нужно будет добавить свои индексы после копирования ваших данных. Начиная с 2.4.3, этот процесс является автоматическим, и вы можете отключить его с помощью
--noIndexRestore
.источник
На самом деле, это команда , чтобы переместить коллекцию из одной базы данных в другую. Это просто не называется «переместить» или «скопировать».
Чтобы скопировать коллекцию, вы можете клонировать ее на том же БД, а затем переместить клон.
Клонировать:
Двигаться:
Другие ответы лучше для копирования коллекции, но это особенно полезно, если вы хотите переместить его.
источник
'db1.source_collection'
Я бы злоупотребил функцией подключения в Mongo Cli Mongo Doc . так что это означает, что вы можете установить одно или несколько соединений. если вы хотите скопировать коллекцию клиентов из test в test2 на том же сервере. сначала вы начинаете монго оболочки
сделать нормальный поиск и скопировать первые 20 записей в test2.
или фильтр по некоторым критериям
просто измените localhost на IP или имя хоста для подключения к удаленному серверу. Я использую это для копирования тестовых данных в тестовую базу данных для тестирования.
источник
Если между двумя удаленными экземплярами Mongod, используйте
См. Http://docs.mongodb.org/manual/reference/command/cloneCollection/.
источник
copyIndexes
опций на самом деле не соблюдается. Индексы всегда копируются. См. SERVER-11418Я бы обычно делал:
источник
для коллекций большого размера вы можете использовать Bulk.insert ()
Это сэкономит много времени . В моем случае я копирую коллекцию с 1219 документами: iter vs Bulk (67 секунд против 3 секунд)
источник
Вы можете использовать структуру агрегации, чтобы решить вашу проблему
Следует отметить, что индексы из oldCollection не будут скопированы в newCollection.
источник
Я знаю, что на этот вопрос был дан ответ, однако я лично не буду отвечать @JasonMcCays из-за того, что курсоры передаются в потоковом режиме, и это может вызвать бесконечный цикл курсора, если коллекция все еще используется. Вместо этого я бы использовал снимок ():
http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database
Ответ @bens также хорош и хорошо работает для горячих резервных копий коллекций не только потому, что mongorestore не нужно использовать один и тот же mongod.
источник
Это может быть просто особый случай, но для коллекции документов размером 100 тыс. С двумя случайными строковыми полями (длина составляет 15-20 символов) использование тупого mapreduce почти в два раза быстрее, чем find-insert / copyTo:
источник
Используя pymongo, вы должны иметь обе базы данных на одном и том же mongod, я сделал следующее:
db = исходная база данных
db2 = база данных для копирования
источник
Это не решит вашу проблему, но оболочка mongodb имеет
copyTo
метод, который копирует коллекцию в другую в той же базе данных :Он также переводит с BSON в формате JSON, поэтому
mongodump
/mongorestore
лучший путь, как уже говорили другие.источник
Если оперативная память не является проблемой, использование
insertMany
происходит быстрее, чемforEach
зацикливание.источник
В случае, если некоторые пользователи heroku спотыкаются здесь и, как я, хотят скопировать некоторые данные из промежуточной базы данных в рабочую базу данных или наоборот, вот как вы делаете это очень удобно (NB. Я надеюсь, что там нет опечаток, не могу проверить это, атм., Я постараюсь подтвердить правильность кода как можно скорее):
источник
Вы всегда можете использовать Robomongo. Начиная с версии 0.8.3 существует инструмент, который может сделать это, щелкнув правой кнопкой мыши коллекцию и выбрав «Копировать коллекцию в базу данных».
Для получения дополнительной информации см. Http://blog.robomongo.org/whats-new-in-robomongo-0-8-3/.
Эта функция была удалена в 0.8.5 из-за ее ошибочной природы, поэтому вам придется использовать 0.8.3 или 0.8.4, если вы хотите попробовать ее.
источник
В моем случае мне пришлось использовать подмножество атрибутов из старой коллекции в моей новой коллекции. В итоге я выбрал эти атрибуты при вызове insert для новой коллекции.
источник
используйте «Studio3T for MongoDB» с инструментами «Экспорт» и «Импорт», щелкнув ссылку на базу данных, коллекцию или ссылку для загрузки конкретной коллекции: https://studio3t.com/download/
источник
Это можно сделать с помощью
db.copyDatabase
метода Монго :Ссылка: http://docs.mongodb.org/manual/reference/method/db.copyDatabase/
источник