Question

I want to clone a MongoDB collection and save it on the same server with a different name. So for example right now I have the following collections: demo1.categories, demo1.users and demo2.users.

I want to have a "demo2.categories" which is identical to "demo1.categories". (It just has a different name.)

Was it helpful?

Solution

Yet again the MongoDB documentation comes to the rescue

assuming that the collection actually is named "demo1.categories":

db.demo1.categories.find().forEach( function(x){db.demo2.categories.insert(x)} );

OTHER TIPS

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.

This is the fastest way to clone your collection:

mongoexport -d db_name -c src_collection | mongoimport -d db_name -c dst_collection --drop

it will clone src_collection in db_name to dst_collection. Or you can do it in two steps on bson level:

mongodump -d db_name -c src_collection
mongorestore --drop -d db_name -c dst_collection ./dump/db_name/src_collection.bson

The fastest option is

db.myoriginal.aggregate([ { $out: "mycopy" } ])

there already has a command for this.

Copy a single collection from one server to another. http://www.mongodb.org/display/DOCS/cloneCollection+Command

If you're concerned about speed then I found that by using aggregate with $project and $out to be a 100 times faster, not sure if there are restrictions though, but you would have to create a set of fields that you'd want to copy For example:

// Set of fields in the categories collection
var setOfFields = {field1:1, field2:1.......}
db.demo1.categories.aggregate([{ "$project": setOfFields},{ $out: "demo2.categories"}]);

This copies (projects) the selected set of fields for all documents from demo1.categories to demo2.categories

Don't use db.cloneCollection() method, it is depreciated from the current version 4.2 instead try to use mongoexport.

depreciated collection method

In the mongo console, you can do the following as well, where db_host is the machine where db_host has the db with the collection that you want to clone.

use db.cloneCollection(, )

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top