Чи є простий спосіб це зробити?
Чи є простий спосіб це зробити?
Відповіді:
Наразі в MongoDB немає команди, яка б це зробила. Зверніть увагу на квиток JIRA з відповідним запитом на функції .
Ви можете зробити щось на кшталт:
db.<collection_name>.find().forEach(function(d){ db.getSiblingDB('<new_database>')['<collection_name>'].insert(d); });
Зверніть увагу, що для цього для двох баз даних потрібно мати спільний доступ до одного і того ж мондору, щоб це працювало.
Крім цього, ви можете виконати збір колекції з однієї бази даних, а потім виконати моніторинг колекції в іншій базі даних.
Найкращий спосіб - це зробити мондомпа, а потім Монгоресторе.
Ви можете вибрати колекцію за допомогою:
mongodump -d some_database -c some_collection
[За бажанням, застебніть дамп ( zip some_database.zip some_database/* -r
) та scp
його інше]
Потім відновіть його:
mongorestore -d some_other_db -c some_or_other_collection dump/some_collection.bson
Існуючі дані в Росії some_or_other_collection
будуть збережені. Таким чином ви можете "додавати" колекцію з однієї бази даних до іншої.
До версії 2.4.3 вам також потрібно буде додати свої індекси після копіювання даних. Починаючи з 2.4.3, цей процес є автоматичним, і ви можете його відключити --noIndexRestore
.
Насправді є команда перемістити колекцію з однієї бази даних в іншу. Це просто не називається "переміщення" або "копіювання".
Щоб скопіювати колекцію, ви можете її клонувати на тому ж db, а потім перемістити клон.
Для клонування:
> 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?
Інші відповіді краще скопіювати колекцію, але це особливо корисно, якщо ви хочете перемістити її.
'db1.source_collection'
Я б зловживав функцією підключення в mongo cli mongo doc . так що це означає, що ви можете запустити одне або більше з'єднань. якщо ви хочете скопіювати колекцію клієнтів з тесту на test2 на одному сервері. спочатку ви запускаєте панцир монго
use test
var db2 = connect('localhost:27017/test2')
зробіть звичайну знахідку та скопіюйте перші 20 записів на тест2.
db.customer.find().limit(20).forEach(function(p) { db2.customer.insert(p); });
або фільтрувати за деякими критеріями
db.customer.find({"active": 1}).forEach(function(p) { db2.customer.insert(p); });
просто змініть localhost на IP або ім'я хоста, щоб підключитися до віддаленого сервера. Я використовую це для копіювання тестових даних у тестову базу даних для тестування.
Якщо між двома віддаленими монгодними екземплярами, використовуйте
{ cloneCollection: "<collection>", from: "<hostname>", query: { <query> }, copyIndexes: <true|false> }
Див. Http://docs.mongodb.org/manual/reference/command/cloneCollection/
copyIndexes
опціонів насправді не дотримується. Індекси завжди копіюються. Дивіться SERVER-11418
для колекцій величезних розмірів можна використовувати Bulk.insert ()
var bulk = db.getSiblingDB(dbName)[targetCollectionName].initializeUnorderedBulkOp();
db.getCollection(sourceCollectionName).find().forEach(function (d) {
bulk.insert(d);
});
bulk.execute();
Це заощадить багато часу . У моєму випадку я копіюю колекцію з 1219 документів: iter vs Bulk (67 sec vs 3 sec)
Ви можете використовувати рамку агрегації, щоб вирішити свою проблему
db.oldCollection.aggregate([{$out : "newCollection"}])
Слід зазначити, що індекси з OldCollection не будуть скопійовані в newCollection.
Я знаю, що на це питання відповіли, але я особисто не став би відповідати @JasonMcCays через те, що курсори потоку, і це може спричинити нескінченний цикл курсора, якщо колекція все ще використовується. Замість цього я б використав знімок ():
http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database
@bens відповідь також хороший і добре працює для гарячих резервних копій колекцій не тільки це, але і mongorestore не потрібно ділитися тим самим mongod.
Це може бути просто окремим випадком, але для колекції 100k документів з двома випадковими рядковими полями (довжина 15-20 символів) використання німого mapreduce майже вдвічі швидше, ніж find-insert / copyTo:
db.coll.mapReduce(function() { emit(this._id, this); }, function(k,vs) { return vs[0]; }, { out : "coll2" })
Використовуючи pymongo, вам потрібно мати обидві бази даних в одному монгоді, я зробив наступне:
db = оригінальна база даних
db2 = база даних, яку потрібно скопіювати
cursor = db["<collection to copy from>"].find()
for data in cursor:
db2["<new collection>"].insert(data)
Це не вирішить вашу проблему, але оболонка mongodb має copyTo
метод, який копіює колекцію в іншу в тій самій базі даних :
db.mycoll.copyTo('my_other_collection');
Це також перекладається з BSON в JSON, тому mongodump
/ mongorestore
як це найкращий шлях, як казали інші.
Якщо оперативна пам'ять не є проблемою, це використання insertMany
швидше, ніж forEach
цикл.
var db1 = connect('<ip_1>:<port_1>/<db_name_1>')
var db2 = connect('<ip_2>:<port_2>/<db_name_2>')
var _list = db1.getCollection('collection_to_copy_from').find({})
db2.collection_to_copy_to.insertMany(_list.toArray())
Якщо деякі користувачі 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. Станом на v0.8.3 є інструмент, який може це зробити, клацнувши по колекції правою кнопкою миші та вибравши "Копіювати колекцію в базу даних"
Детальніше див. На http://blog.robomongo.org/whats-new-in-robomongo-0-8-3/
Ця функція була видалена в 0.8.5 через її помилку, тому вам доведеться скористатися 0.8.3 або 0.8.4, якщо ви хочете спробувати.
У моєму випадку мені довелося використовувати підмножину атрибутів зі старої колекції у своїй новій колекції. Тож я вирішив вибрати ці атрибути під час виклику вставок у нову колекцію.
db.<sourceColl>.find().forEach(function(doc) {
db.<newColl>.insert({
"new_field1":doc.field1,
"new_field2":doc.field2,
....
})
});`
використовуйте "Studio3T для MongoDB", які мають інструменти експорту та імпорту, натиснувши на базу даних, колекції або конкретне посилання для завантаження колекції: https://studio3t.com/download/
Це можна зробити за допомогою db.copyDatabase
методу Монго :
db.copyDatabase(fromdb, todb, fromhost, username, password)
Довідка: http://docs.mongodb.org/manual/reference/method/db.copyDatabase/