【问题标题】:Copying a mongo collection with huge data to another collection?将具有大量数据的 mongo 集合复制到另一个集合?
【发布时间】:2017-07-01 17:12:36
【问题描述】:

我有一个包含 250 万数据的 mongo 集合,并且可能会增长到 300 万。我正在使用弹簧批处理,并试图将该集合复制到另一个集合。我使用的方法如下:

  • 在 tasklet 中,我创建了一个 ProcessBuilder 对象并调用了一个执行 mongo 查询的 shell 脚本。 shell脚本内容如下:

    >  mongo $serverURL/$dbName js-file-to-execute.js
    
    // js file contains copy command (db.collection.copyto('newCollection'))
    

对于较少的数据(

  • 使用 mongo 模板并执行查询

dbMongoTemplate.getDb().getCollection("collection").aggregate(Arrays.asList((DBObject) new BasicDBObject("$out","newCollection")));

这会执行一个 mongo 聚合查询 db.collection.aggregate({$out : "newCollection"})

这也适用于数据较少的集合,但对于较大的数据集,它会一直运行,直到发生套接字超时并最终导致作业失败。

请建议复制数据的有效方法?

【问题讨论】:

  • 您使用的是什么版本和存储引擎? MongoDB集群的结构是什么:standalone、replica set、sharded?您是否正在寻找最快的解决方案(挂钟)、使用最少的额外资源(磁盘和/或内存)或对服务器的影响最小(例如,不要挂起服务器)。
  • 我使用的是 mongodb 2.6,而 mongoDB 集群是 standalone。我更喜欢一种平衡解决方案,它确实会花费大量时间,对服务器产生平均影响。
  • profesor79 的回答对你有帮助吗?我也是这种情况
  • 是的,它有帮助,但您可以使用 mongo import 和 mongo export 代替 mongodump 和 mongorestore。您还可以通过管道将这些操作用于内联复制。

标签: mongodb nosql


【解决方案1】:
//Fastest way to copy a Collection in MongoDB
db.getCollection('OriginalCollection').aggregate([ { $out: "ClonedCollection" } ]);

此命令在大约 2-3 分钟内复制了 200 万条记录的集合。

https://gist.github.com/tejzpr/ff37324a8c26d13fef08c318278c0718

【讨论】:

  • 您好,我需要将包含 100k 个数据集的集合 A 记录复制到包含百万个数据集的集合 B。在这种情况下,当我使用上述查询时,它会导致任何性能问题,并且我在 Collection B 上有索引以进行快速读取。我使用的是 3.2.1 Mongodb
  • 非常感谢这个技巧! 2-3 分钟 - 这是一个悬而未决的问题,我想这取决于集合的大小。在我的例子中,230 万条记录(~9Gib 存储大小)大约需要 25 分钟。
【解决方案2】:

要复制这个集合,我建议使用 mongodump/mongoexport

mongodump --db databaseName --collection collectionName --out directory-path

然后复制目录directory-path,然后在目标机器上使用恢复

mongorestore --db databaseName --collection collectionName 目录路径

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 2010-09-13
    • 2016-08-24
    相关资源
    最近更新 更多