2015-09-05 3 views
0

Мне нужна помощь в копировании одной коллекции из одной базы данных в другую. Я много раз искал, но не получил правильного решения. Все используют copyTo или простой запрос поиска внутри вставки. которые не являются лучшим решением. Потому что copyTo блокирует все мои операции с базой данных. и вставка занимает слишком много времени для копирования данных из одной коллекции в другую. Потому что у меня есть миллионы записей в моей коллекции.php: MongoDB копирование коллекции из базы данных в другую

Я проверил одну команду в MongoDB:

db.runCommand({renameCollection:'db1.collection_name', to: 'db2.collection_name'}); 

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

Может ли у кого есть лучшее предложение? Пожалуйста, помогите мне в этом скрипте.

+0

Привет, я нашел его решение, используя его «mongodump» любую коллекцию баз данных, а затем «mongorestore» для любой другой коллекции баз данных. –

ответ

0

Если вы не хотите использовать copyTo, найдите внутреннюю вставку - это ваша следующая самая быстрая ставка. Это как собственные команды MongoDB, вы не собираетесь, чтобы получить быстрее, чем это

Вариант 2

В то время как я утверждаю, что найти внутри вставки быстрее вы можете получить (кроме CopyTo) другой вариант, который имеет дополнительное преимущество для поддержания ваших индексов, заключается в использовании mongodump, а затем mongorestore с другим именем коллекции. Сделайте это либо с сервера, на котором размещен ваш mongodb, либо предоставите сервер на короткое время около вашего mongodb, поэтому он будет быстро

+0

Спасибо за ответ, но извините, я не могу использовать это. потому что это занимает много времени .. Если у вас есть какие-либо другие предложения. Тогда, пожалуйста, предложите мне. –

0

Это довольно просто при использовании bulk operations.

Для php это называется batch operations. Просто получите все документы из исходной базы данных (которые будут обрабатываться как массив) и поместите их как параметр в метод batchInsert.

Если вам нужно только сделать это один раз, вы можете легко сделать это на Монго оболочки:

use sourceDb 
var targetDb= db.getSiblingDB("targetDb") 
var bulk = targetDb.targetCollection.initializeUnorderedBulkOp() 
var docs = db.sourceCollection.find() 
docs.forEach(
    function(doc){ 
    bulk.insert(doc); 
    } 
) 
bulk.execute() 

Заметим, что это не копирует индексы, которые вы должны либо генерировать до или после указанной выше операции насыпной ,

+0

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

+0

Вы должны выполнить массовые операции каждые 100k записей или sth, как это. –