在MongoDB中克隆一个集合

Dar*_*yna 51 mongodb

我想克隆MongoDB集合并将其保存在具有不同名称的同一服务器上.例如,我现在有以下集合:demo1.categories,demo1.users和demo2.users.

我想要一个"demo2.categories",它与"demo1.categories"相同.(它只是有一个不同的名字.)

lha*_*ann 82

然而,MongoDB文档再次得到了拯救

假设该集合实际上被命名为"demo1.categories":

db.demo1.categories.find().forEach( function(x){db.demo2.categories.insert(x)} );
Run Code Online (Sandbox Code Playgroud)

  • 从2.1+开始,你可以做db.demo1.copyTo("demo2"); (54认同)
  • `copyTo`阻止mongod实例中的所有其他操作 (13认同)
  • 在2.0.4中,这种方式将我的集合的int值转换为double值...所以,这种方法不能保证100%的相等... (3认同)

Abd*_*ady 30

最简单有效的方法是使用copyTo(),这样你就可以使用:

db.source.copyTo("target"); 
Run Code Online (Sandbox Code Playgroud)

&if如果"target"不存在,将创建它

- 更新 -

根据CopyTo文档,因为在copyTo()内部使用eval,复制操作将阻止mongod实例上的所有其他操作.所以不应该在生产环境中使用它.

- 更新 -

因为从内部CopyTo()使用eval()&eval()从3.0版开始不推荐使用,所以CopyTo()从版本3.0开始也不推荐使用.

  • 不要在生产系统上运行copyTo.正如对已接受答案的评论中所提到的,它将阻止您的mongod实例上的其他操作,从而有效地使其在持续时间内不可用. (2认同)

Tut*_*men 24

这是克隆集合的最快方法:

mongoexport -d db_name -c src_collection | mongoimport -d db_name -c dst_collection --drop
Run Code Online (Sandbox Code Playgroud)

它会克隆src_collectionDB_NAMEdst_collection.或者你可以在bson级别上分两步完成:

mongodump -d db_name -c src_collection
mongorestore --drop -d db_name -c dst_collection ./dump/db_name/src_collection.bson
Run Code Online (Sandbox Code Playgroud)

  • 这种方式不仅最简单,而且还保证您在二进制级别上具有100%的身份,但find()和insert()方式则不然.例如,它将所有整数记录转换为数字等 (3认同)
  • 为了进行身份验证,并连接到远程服务器,请将以下参数添加到管道的两侧 - `--host="whatever" --port="27017" --username="myuser" --password="mypass" - -authenticationDatabase =“管理员”` (2认同)

tej*_*zpr 15

最快的选择是

db.myoriginal.aggregate([ { $out: "mycopy" } ])
Run Code Online (Sandbox Code Playgroud)