97

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

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

我知道该cloneCollection命令,但它似乎仅用于复制到另一台服务器。

我也知道mongoimportand mongoexport,但是当我通过 PHP 执行此操作时,我不想调用 shell。

4

8 回答 8

264
db.myoriginal.aggregate([ { $match: {} }, { $out: "mycopy" } ])

它比在 forEach 循环中进行多次插入要快得多。

于 2015-11-24T08:55:04.107 回答
61

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

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 查询。

于 2012-05-16T21:36:29.913 回答
16

注意:阅读答案更新,它们很重要!


最简单有效的方法是使用copyTo(),因此您可以使用:

db.source.copyTo("target"); 

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

- 更新 -

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

- 更新 -

因为在内部CopyTo()使用&自 3.0 版以来已弃用,所以自 3.0 版以来也已弃用eval()eval()CopyTo()

于 2014-01-19T17:42:27.133 回答
3

第一个选项(使用 mongo 转储)

  1. 从集合中获取转储

    mongodump -d db -c source_collection

  2. 从收藏中恢复

    mongorestore -d db -c target_collection dir=dump/db_name/source_collection.bson

第二种选择

  1. 运行骨料

    db.getCollection('source_collection').aggregate([ { $match: {"emailAddress" : "apitester@mailinator.com"} }, { $out: "target_collection" } ])

第三个选项(最慢)

  1. 运行一个 for 循环

    db.getCollection('source_collection').find().forEach(function(docs){ db.getCollection('target_collection').insert(docs); }) print("回滚完成!");

于 2020-02-10T09:29:30.130 回答
0

除了 AD7six 1st 解决方案,如果您使用 mongoexport / import,请确保您的集合数据类型和 mongo 配置,如下所述:http: //docs.mongodb.org/manual/reference/mongodb-extended-json/

于 2013-05-08T11:28:25.533 回答
0

这是我在 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])
于 2019-04-24T13:34:03.563 回答
-1

最快的方法是db.collection.copyTo()

请注意,自 3.0 版起已弃用。

于 2018-01-12T12:27:15.363 回答
-3

您可以在 mongo shell 中使用 copyDatabase 函数:

http://docs.mongodb.org/manual/tutorial/copy-databases-between-instances/

于 2013-11-10T09:32:08.577 回答