Clone a collection in MongoDB

后端 未结 8 533
有刺的猬
有刺的猬 2020-12-02 10:19

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

相关标签:
8条回答
  • 2020-12-02 10:48

    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.

    0 讨论(0)
  • 2020-12-02 10:49

    The fastest option is

    db.myoriginal.aggregate([ { $out: "mycopy" } ])
    
    0 讨论(0)
  • 2020-12-02 10:50

    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(, )

    0 讨论(0)
  • 2020-12-02 10:51

    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)} );
    
    0 讨论(0)
  • 2020-12-02 10:59

    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
    
    0 讨论(0)
  • 2020-12-02 10:59

    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

    0 讨论(0)
提交回复
热议问题