Clone a collection in MongoDB
-
17-04-2021 - |
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.)
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
.
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(, )