我有一个拥有250万数据的mongo集合,可能会增长到300万。我正在使用spring批处理,并试图将该集合复制到另一个集合。我使用的方法如下:
在一个tasklet中,我创建了一个ProcessBuilder对象,并调用了一个执行mongo查询的shell脚本。 shell脚本的内容如下:
> mongo $serverURL/$dbName js-file-to-execute.js
// js file contains copy command (db.collection.copyto('newCollection'))
对于较少的数据(<200 k),它工作正常,但对于200万个数据,它挂起mongo服务器并且作业因Socket异常而失败
dbMongoTemplate.getDb().getCollection("collection").aggregate(Arrays.asList((DBObject) new BasicDBObject("$out","newCollection")));
执行mongo聚合查询db.collection.aggregate({$out : "newCollection"})
这也适用于数据量较少的集合,但对于较大的数据集,它会一直运行,直到发生套接字超时,并在最后失败。
请建议有效的数据复制方式?
答案 0 :(得分:1)
要复制此集合,我将使用mongodump / mongoexport
进行复制mongodump --db databaseName --collection collectionName --out directory-path
然后复制目录directory-path
,然后使用
mongorestore --db databaseName --collection collectionName directory-path
答案 1 :(得分:1)
//Fastest way to copy a Collection in MongoDB
db.getCollection('OriginalCollection').aggregate([ { $out: "ClonedCollection" } ]);
此命令在大约2-3分钟内复制了200万条记录的集合。
https://gist.github.com/tejzpr/ff37324a8c26d13fef08c318278c0718