我想在同一个数据库中复制一个集合,并给它一个不同的名称 - 基本上是拍摄快照.
最好的方法是什么?有命令,还是我必须依次复制每条记录?
我知道该cloneCollection
命令,但它似乎只是复制到另一台服务器.
我也知道mongoimport
并且mongoexport
,但是当我通过PHP这样做时,我宁愿不打电话给shell.
yoo*_*shi 189
db.myoriginal.aggregate([ { $match: {} }, { $out: "mycopy" } ])
Run Code Online (Sandbox Code Playgroud)
它比在forEach循环中执行许多插入要快得多.
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开始也不推荐使用.
归档时间: |
|
查看次数: |
49147 次 |
最近记录: |