如何在不使用map/reduce的情况下转换MongoDB大型集合中的每个文档?

3
抱歉,描述比较冗长。
我想在一个大型的Mongodb集合中运行转换操作,该集合包含大约1000万条记录,约10G。具体而言,我想对每个文档中的ip字段应用geoip转换,并将结果记录追加到该文档中,或者只是创建一个与此记录相关联的全新记录(例如通过id进行关联)。然后,我想按城市分组统计数量(我知道如何执行最后一步)。
我相信无法使用map-reduce的主要原因是我无法在映射函数中调用geoip库(或者至少我认为存在这样的约束)。
因此,核心问题是如何遍历集合中的每个记录并应用变换 - 使用最有效的方法来执行此操作。
通过Limit / skip批处理不可行,因为它会执行“表扫描”,并且速度会逐渐变慢。
有什么建议吗?
Python或Js首选,因为我有这些geoip库,但其他语言的代码示例也可以。
2个回答

1

由于您需要遍历“每个记录”,因此您将执行一个完整的表扫描,然后使用简单的游标(find())+可能仅获取少量字段(_id、ip)即可完成。Python驱动程序将在幕后进行批处理,因此如果默认值不够好,您可以给出有关最佳批处理大小(batch_size)的提示。

如果您添加了一个新字段,它不适合先前分配的空间,则Mongo将不得不将其移动到另一个位置,因此最好创建一个新文档。


好的,非常感谢 - 我之前不知道有驱动程序批处理的功能 - 现在我看了API文档,明白了 - 非常感谢,很有帮助。 - Nitin

0

实际上,我还在尝试另一种并行的方法(作为备选方案),即使用mongoexport。我使用--csv参数将仅包含(id,ip)字段的大型csv文件转储。然后计划使用Python脚本进行geoip查找,然后将其作为新文档发布回Mongo,然后可以运行map-reduce以进行计数等操作。不确定这是否比游标更快。我们拭目以待。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接