我想在同一数据库中复制一个集合,并给它一个不同的名称-基本上拍摄快照。
最好的方法是什么?是否有命令,还是我必须依次复制每个记录?
我知道该cloneCollection
命令,但它似乎仅用于复制到另一台服务器。
我也知道mongoimport
和mongoexport
,但是当我通过PHP执行此操作时,我不希望对shell进行调用。
Answers:
您有几种选择,但是最快的是:
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 execute函数避免cli调用,则可以发出上述mongo查询。
db.myoriginal.aggregate([ { $match: {} }, { $out: "mycopy" } ])
它比在forEach循环中执行许多插入要快得多。
注意:阅读答案更新,它们很重要!
最简单有效的方法是使用copyTo(),因此您可以使用:
db.source.copyTo("target");
&如果"target"
不存在,它将被创建
-更新-
根据CopyTo Documentation,由于copyTo()
内部使用eval,因此复制操作将阻止mongod实例上的所有其他操作。所以它不应该在生产中使用环境中。
-更新-
因为内部CopyTo()
使用eval()
&eval()
从3.0版开始不推荐使用,所以CopyTo()
也从3.0版开始不推荐使用。
copyTo()
将阻止该mongod
实例上的所有操作。从文档中:>因为copyTo()在内部使用eval,所以复制操作将阻止mongod实例上的所有其他操作。
第一选择(使用mongo dump)
从集合中获取转储
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(“ Rolleback完成!”);
除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/