2

我有一个很大的 mongoDB 集合。我想将此集合导出为 CSV,然后我可以将其导入统计数据包中进行数据分析。

该集合中有大约 15 GB 的文档。我想将集合拆分为大约 100 个大小相同的 CSV 文件。有没有办法使用 mongoexport 来实现这一点?我还可以在 pymongo 中查询整个集合,将其拆分并手动写入 csv 文件,但我想这会更慢并且需要更多编码。

感谢您的意见。

4

3 回答 3

5

您可以使用--skip&--limit选项来完成。

例如,如果您的集合包含 1,000 个文档,您可以使用脚本循环(伪代码)来执行此操作:

loops = 100
count = db.collection.count()
batch_size = count / loops

for (i = 0; i < loops; i++) {
    mongoexport --skip (batch_size * i) --limit batch_size --out export${i}.json ...
} 

考虑到您的文档大小大致相等。

但是请注意,大的跳跃速度很慢。

下限迭代将比上限迭代快。

于 2015-03-16T16:29:09.607 回答
0

上述循环的更好版本可以并行执行所有操作,因为您像我一样是个不耐烦的sonnofabitch:

假设我们有 385892079 条记录,将其除以 100。

let bs=3858920 for i in {1..100} do let bsi=${bs}*$i mongoexport --db dbnamehere --collection collectionNamehere --port 3303\ --fields="f1,f2,f3" \ --out /opt/path/to/output/dir/dump.${i}.json -v \ --skip ${bsi} --limit ${bs} done

于 2016-02-04T00:42:35.247 回答
0
#total=335584
limit=20974;
skip=0;
for i in {1..16}; do mongoexport --host localhost --db tweets --collection mycollection --type=csv --fields tweet_id,user_name,user_id,text --out master_new/mongo_rec_${i}.csv -v --skip ${skip} --limit ${limit} --quiet; let skip=$((skip+limit)); done
于 2016-11-29T06:01:50.740 回答