Подтвердить что ты не робот

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

Я хочу скопировать коллекцию в базу той же и дать ей другое имя - в основном сделать снимок.

Какой лучший способ сделать это? Есть ли команда, или я должен копировать каждую запись по очереди?

Я знаю команду cloneCollection, но, похоже, для копирование только на другой сервер.

Я также знаю mongoimport и mongoexport, но поскольку я делаю это с помощью PHP, я бы предпочел не делать вызовы в оболочку.

4b9b3361

Ответ 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.