我有一个很大的 mongoDB 集合。我想将此集合导出为 CSV,然后我可以将其导入统计数据包中进行数据分析。
该集合中有大约 15 GB 的文档。我想将集合拆分为大约 100 个大小相同的 CSV 文件。有没有办法使用 mongoexport 来实现这一点?我还可以在 pymongo 中查询整个集合,将其拆分并手动写入 csv 文件,但我想这会更慢并且需要更多编码。
感谢您的意见。
我有一个很大的 mongoDB 集合。我想将此集合导出为 CSV,然后我可以将其导入统计数据包中进行数据分析。
该集合中有大约 15 GB 的文档。我想将集合拆分为大约 100 个大小相同的 CSV 文件。有没有办法使用 mongoexport 来实现这一点?我还可以在 pymongo 中查询整个集合,将其拆分并手动写入 csv 文件,但我想这会更慢并且需要更多编码。
感谢您的意见。
您可以使用--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 ...
}
考虑到您的文档大小大致相等。
但是请注意,大的跳跃速度很慢。
下限迭代将比上限迭代快。
上述循环的更好版本可以并行执行所有操作,因为您像我一样是个不耐烦的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
#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