What's the fastest way to copy a collection within the same database?
db.myoriginal.aggregate([ { $match: {} }, { $out: "mycopy" } ])
It is a lot faster than doing many inserts in a forEach loop.
You have a few options, but the fastest is:
mongodump -d db -c sourcecollection
mongorestore -d db -c targetcollection --dir=dump/<db>/<sourcecollection.bson>
or
mongoexport -d db -c sourcecollection | mongoimport -d db -c targetcollection --drop
or in php:
`mongoexport -d db -c sourcecollection | mongoimport -d db -c targetcollection --drop`;
after that you have
mongo db < script.js
where, as shown in the mongo docs, script.js contains something like:
db.myoriginal.find().forEach( function(x){db.mycopy.insert(x)} );
The slowest (by an order of magnitude or more) way to copy a collection will be to use the native php driver - simply because of moving information around. But you could issue the above mongo query if you absolutely want to avoid cli calls using the db execute function.
Note: Read the answer Updates, they are important!
The most simple & efficient way is by using copyTo(), so you can use:
db.source.copyTo("target");
& if "target"
doesn't exist, it will be created
-- Update --
According to CopyTo Documentation, Because copyTo()
uses eval internally, the copy operations will block all other operations on the mongod instance. So it shouldn't be used on production environment.
-- Update --
Because CopyTo()
uses eval()
internally & eval()
is deprecated since version 3.0, so CopyTo()
is also deprecated since version 3.0.