Какой самый быстрый способ скопировать коллекцию в пределах одной базы данных?
Я хочу скопировать коллекцию в базу той же и дать ей
другое имя - в основном сделать снимок.
Какой лучший способ сделать это? Есть ли команда, или я должен
копировать каждую запись по очереди?
Я знаю команду cloneCollection
, но, похоже, для
копирование только на другой сервер.
Я также знаю mongoimport
и mongoexport
, но поскольку я делаю это с помощью PHP, я бы предпочел не делать вызовы в оболочку.
Ответы
Ответ 1
У вас есть несколько вариантов, но самый быстрый из них:
mongodump -d db -c sourcecollection
mongorestore -d db -c targetcollection --dir=dump/<db>/<sourcecollection.bson>
mongoexport -d db -c sourcecollection | mongoimport -d db -c targetcollection --drop
или в php:
`mongoexport -d db -c sourcecollection | mongoimport -d db -c targetcollection --drop`;
после этого у вас
mongo db < script.js
где, как показано в mongo docs, script.js содержит что-то вроде:
db.myoriginal.find().forEach( function(x){db.mycopy.insert(x)} );
Самый медленный (на порядок или более) способ копирования коллекции будет использовать собственный драйвер php - просто из-за перемещения информации вокруг. Но вы можете опубликовать вышеупомянутый запрос mongo, если вы абсолютно хотите избежать вызовов cli с помощью функции db execute.
Ответ 2
db.myoriginal.aggregate([ { $match: {} }, { $out: "mycopy" } ])
Это намного быстрее, чем много вставок в цикле forEach.
Ответ 3
Примечание: прочитайте ответ Обновления, они важны!
Самый простой и эффективный способ - использовать copyTo(), поэтому вы можете использовать:
db.source.copyTo("target");
& если "target"
не существует, она будет создана
-- Обновить --
Согласно Документации CopyTo, поскольку copyTo()
использует eval для внутреннего использования, операции копирования блокируют все другие операции на экземпляре mongod. Поэтому его не следует использовать в производственной среде.
-- Обновить --
Поскольку CopyTo()
использует eval()
внутри, & eval()
устарела с версии 3.0, поэтому CopyTo()
также устарела с версии 3.0.
Ответ 4
В дополнение к решению AD7six 1st, если вы используете mongoexport/import, не забудьте о ваших типах данных коллекции и конфигурации mongo, как описано здесь: http://docs.mongodb.org/manual/reference/mongodb-extended-json/
Ответ 5
Это моя реализация в python (pymongo):
def copy_collection(client, from_db, from_coll, to_db=None, to_coll=None):
to_db = from_db if to_db is None else to_db
to_coll = from_coll if to_coll is None else to_coll
assert (to_db != from_db or to_coll != from_coll), "Copy Error: Source and destination can't be same!"
documents = client[from_db][from_coll].find()
client[to_db][to_coll].insert_many([d for d in documents])
Ответ 6
Самый быстрый способ - это db.collection.copyTo().
Обратите внимание, что он устарел с версии 3.0.
Ответ 7
Вы можете использовать функцию copyDatabase в оболочке mongo:
http://docs.mongodb.org/manual/tutorial/copy-databases-between-instances/