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

Mongodb 什么';在同一数据库中复制集合的最快方法是什么?,mongodb,Mongodb,我想在相同的数据库中复制一个集合,并给它一个 不同的名称-基本上拍摄快照 最好的方法是什么?有命令吗,还是我必须 依次复制每条记录 我知道cloneCollection命令,但它似乎是用于 仅复制到另一台服务器 我也知道mongoimport和mongoexport,但由于我是通过PHP实现这一点的,所以我不想调用shell。您有一些选择,但最快的是: mongodump -d db -c sourcecollection mongorestore -d db -c targetcollect

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

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

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


我也知道
mongoimport
mongoexport
,但由于我是通过PHP实现这一点的,所以我不想调用shell。

您有一些选择,但最快的是:

mongodump -d db -c sourcecollection 
mongorestore -d db -c targetcollection --dir=dump/<db>/<sourcecollection.bson>
或在php中:

`mongoexport -d db -c sourcecollection | mongoimport -d db -c targetcollection --drop`;
在那之后你有

mongo db < script.js

复制集合的最慢方式(数量级或更慢)是使用本机php驱动程序,这仅仅是因为移动了信息。但是,如果您确实希望避免使用该函数调用cli,则可以发出上述mongo查询。

除了AD7six 1st解决方案之外,如果您使用mongoexport/import,请确保收集数据类型和mongo配置,如下所述:

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


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


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

db.source.copyTo("target"); 
&如果
“目标”
不存在,将创建它

--更新--

根据,由于
copyTo()
在内部使用eval,复制操作将阻止mongod实例上的所有其他操作。因此,它不应用于生产环境

--更新--

由于
CopyTo()
在内部使用&
eval()
自3.0版以来已被弃用,因此
CopyTo()
自3.0版以来也被弃用

db.myoriginal.aggregate([ { $match: {} }, { $out: "mycopy" } ])
这比在forEach循环中执行许多插入要快得多。

最快的方法是


请注意,从3.0版开始,它就被弃用了。

这是我用python(pymongo)实现的:

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

  • 从集合中获取转储

    mongodump-ddb-c源代码集合

  • 从集合还原

    mongorestore-d db-c target\u collection dir=dump/db\u name/source\u collection.bson

  • 第二选项

  • 流动骨料

    db.getCollection('source_collection').aggregate([{$match:{“emailAddress”:”apitester@mailinator.com“},{$out:”目标集合“}])

  • 第三个选项(最慢)

  • 运行直通for循环

    db.getCollection('source_collection').find().forEach(函数(文档){ db.getCollection('target_collection')。插入(文档); }) 打印(“回滚完成!”)


  • 谢谢我目前正在使用您的第一个选项,但希望有一个命令我可以简单地调用,这样我就不需要从PHP调用shell。我可以尝试使用哑mapReduce(自映射,无还原)的脚本方法,mongoexpor和script.js解决方案之间的衡量标准…Mongodump | mongorestore应该比export | import快,因为它不必将二进制格式反序列化为json或csv。在复制到targetcollection期间如何保留索引?请澄清/说明您希望指出的内容。Mongoimport和mongoexport使用相同的格式,不需要配置,也不存在数据在AIK中发生变异的风险。请注意,答案应该是搜索解决方案的终点(而不是另一个参考的中途停留,随着时间的推移,它往往会过时)。请考虑在这里添加一个独立的概要,将链接作为引用。UTO V2.63<代码> CopyToTo()/代码>将阻止<代码>蒙神< /Cord>实例的所有操作。从文档:>因为copyTo()在内部使用eval,所以复制操作将阻止mongod实例上的所有其他操作。@YogeshMangaj感谢您的提醒,我更新了答案,使每个人都能轻松看到。自3.0版以来已弃用。不要这样做。正如文档中所解释的,这将阻止所有写入操作。@lbolla我在几个月前的回答中已经提到了这一点:i5 PC上1-2分钟内可存储12 GB的数据。最好的部分是:它是非阻塞的。请注意,target不能是封顶集合。谢谢,这太完美了。请注意,索引将丢失如何使用此方法将索引包含到新集合?为什么要插入{$match:{}?。事实上,它在没有它的情况下对我有效(我有4.2)。正确的答案是230票的答案。
    db.myoriginal.aggregate([{$match:{},{$out:“mycopy”}])
    这是比公认的答案更快的答案。很高兴知道,谢谢。我无法接受这个答案,但它在2012年可能是正确的$out需要MongoDB的v2.6版本,该版本直到2014年才发布。
    db.source.copyTo("target"); 
    
    db.myoriginal.aggregate([ { $match: {} }, { $out: "mycopy" } ])
    
    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])