What's the fastest way to copy a collection within the same database?

mongodb

Solution

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.

Problem

I want to copy a collection within the same database and give it a different name - basically take a snapshot. What's the best way to do this? Is there a command, or do I have to copy each record in turn? I'm aware of the `cloneCollection` command, but it seems to be for copying to another server only. I'm also aware of `mongoimport` and `mongoexport`, but as I'm doing this via PHP I'd prefer not to make calls out to the shell.

Original source

Related problems