我想在同一个数据库中复制一个集合并给它一个不同的名称 - 基本上是拍摄快照。
最好的方法是什么?是否有命令,或者我必须依次复制每条记录?
我知道该cloneCollection
命令,但它似乎仅用于复制到另一台服务器。
我也知道mongoimport
and mongoexport
,但是当我通过 PHP 执行此操作时,我不想调用 shell。
我想在同一个数据库中复制一个集合并给它一个不同的名称 - 基本上是拍摄快照。
最好的方法是什么?是否有命令,或者我必须依次复制每条记录?
我知道该cloneCollection
命令,但它似乎仅用于复制到另一台服务器。
我也知道mongoimport
and mongoexport
,但是当我通过 PHP 执行此操作时,我不想调用 shell。
db.myoriginal.aggregate([ { $match: {} }, { $out: "mycopy" } ])
它比在 forEach 循环中进行多次插入要快得多。
您有几个选择,但最快的是:
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
或在 php 中:
`mongoexport -d db -c sourcecollection | mongoimport -d db -c targetcollection --drop`;
之后你有
mongo db < script.js
其中,如mongo docs所示,script.js 包含以下内容:
db.myoriginal.find().forEach( function(x){db.mycopy.insert(x)} );
复制集合的最慢(一个数量级或更多)方法是使用本机 php 驱动程序 - 仅仅是因为移动信息。但是,如果您绝对想避免使用db 执行功能的 cli 调用,则可以发出上述 mongo 查询。
注意:阅读答案更新,它们很重要!
最简单有效的方法是使用copyTo(),因此您可以使用:
db.source.copyTo("target");
& 如果"target"
不存在,将被创建
- 更新 -
根据CopyTo Documentation,因为copyTo()
在内部使用 eval ,所以复制操作将阻塞 mongod 实例上的所有其他操作。所以它不应该在生产环境中使用。
- 更新 -
因为在内部CopyTo()
使用&自 3.0 版以来已弃用,所以自 3.0 版以来也已弃用。eval()
eval()
CopyTo()
第一个选项(使用 mongo 转储)
从集合中获取转储
mongodump -d db -c source_collection
从收藏中恢复
mongorestore -d db -c target_collection dir=dump/db_name/source_collection.bson
第二种选择
运行骨料
db.getCollection('source_collection').aggregate([ { $match: {"emailAddress" : "apitester@mailinator.com"} }, { $out: "target_collection" } ])
第三个选项(最慢)
运行一个 for 循环
db.getCollection('source_collection').find().forEach(function(docs){ db.getCollection('target_collection').insert(docs); }) print("回滚完成!");
除了 AD7six 1st 解决方案,如果您使用 mongoexport / import,请确保您的集合数据类型和 mongo 配置,如下所述:http: //docs.mongodb.org/manual/reference/mongodb-extended-json/
这是我在 python (pymongo) 中的实现:
def copy_collection(client, from_db, from_coll, to_db=None, to_coll=None):
to_db = from_db if to_db is None else to_db
to_coll = from_coll if to_coll is None else to_coll
assert (to_db != from_db or to_coll != from_coll), "Copy Error: Source and destination can't be same!"
documents = client[from_db][from_coll].find()
client[to_db][to_coll].insert_many([d for d in documents])
最快的方法是db.collection.copyTo()。
请注意,自 3.0 版起已弃用。
您可以在 mongo shell 中使用 copyDatabase 函数:
http://docs.mongodb.org/manual/tutorial/copy-databases-between-instances/