在同一个数据库中复制集合的最快方法是什么?

Tim*_*Tim 62 mongodb

我想在同一个数据库中复制一个集合,并给它一个不同的名称 - 基本上是拍摄快照.

最好的方法是什么?有命令,还是我必须依次复制每条记录?

我知道该cloneCollection命令,但它似乎只是复制到另一台服务器.

我也知道mongoimport并且mongoexport,但是当我通过PHP这样做时,我宁愿不打电话给shell.

yoo*_*shi 189

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

它比在forEach循环中执行许多插入要快得多.

  • 在i5 PC上1-2分钟内可获得12GB数据.最好的部分:它是非阻塞的 (4认同)
  • 谢谢,这是完美的.请注意,指数将丢失 (4认同)
  • 如何使用此方法将索引包含在新集合中? (3认同)
  • 为什么要插入 { $match: {} }?实际上,它对我来说没有它也能工作(我有 4.2)。 (3认同)

AD7*_*six 54

你有几个选择,但最快的是:

mongodump -d db -c sourcecollection 
mongorestore -d db -c targetcollection --dir=dump/<db>/<sourcecollection.bson>

mongoexport -d db -c sourcecollection | mongoimport -d db -c targetcollection --drop
Run Code Online (Sandbox Code Playgroud)

或者在php中:

`mongoexport -d db -c sourcecollection | mongoimport -d db -c targetcollection --drop`;
Run Code Online (Sandbox Code Playgroud)

之后你就拥有了

mongo db < script.js
Run Code Online (Sandbox Code Playgroud)

其中,如mongo docs所示,script.js包含如下内容:

db.myoriginal.find().forEach( function(x){db.mycopy.insert(x)} );
Run Code Online (Sandbox Code Playgroud)

复制集合的最慢(按一个数量级或更多)方式将使用本机php驱动程序 - 仅仅因为移动信息.但是如果你绝对想要使用db execute函数来避免cli调用,你可以发出上面的mongo查询.


Abd*_*ady 13

最简单有效的方法是使用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开始也不推荐使用.

  • 自3.0版以来已弃用. (7认同)
  • 高达v2.6.3`copyTo()`将阻止`mongod`实例上的所有操作.从文档:>因为copyTo()在内部使用eval,复制操作将阻止mongod实例上的所有其他操作. (4认同)