【问题标题】:How do I transform every doc in a large Mongodb collection without map/reduce?如何在没有 map/reduce 的情况下转换大型 Mongodb 集合中的每个文档?
【发布时间】:2011-12-29 02:33:05
【问题描述】:

对冗长的描述表示歉意。

我想对包含 1000 万条记录(大约 10G)的大型 Mongodb 集合中的每个文档进行转换。具体来说,我想对每个文档中的 ip 字段应用 geoip 转换,然后将结果记录附加到该文档,或者只是创建一个完整的其他记录,通过说 id 链接到这个记录(链接并不重要,我可以创建一个整个单独的记录)。然后我想按城市进行计数和分组-(我确实知道如何做最后一部分)。

我认为我不能使用 map-reduce 的主要原因是我无法在我的地图函数中调用 geoip 库(或者至少这是我认为存在的约束)。

所以我的中心问题是如何遍历集合中的每条记录应用转换 - 使用最有效的方法来做到这一点。

通过 Limit/skip 进行批处理是没有问题的,因为它会执行“表扫描”,并且会逐渐变慢。

有什么建议吗?

首选 Python 或 Js,因为我有这些 geoip 库,但欢迎使用其他语言的代码示例。

【问题讨论】:

    标签: python mongodb mapreduce


    【解决方案1】:

    由于您必须遍历“每条记录”,因此无论如何您都将进行一次全表扫描,然后一个简单的游标 (find()) + 可能只获取几个字段 (_id, ip) 就可以了。 python 驱动程序将在后台进行批处理,因此如果默认值不够好,也许您可​​以提示最佳批处理大小 (batch_size)。

    如果您添加一个新字段并且它不适合先前分配的空间,mongo 将不得不将其移动到另一个地方,因此您最好创建一个新文档。

    【讨论】:

    • 好的,非常感谢 - 不知道驱动程序的批处理 - 我查看了 API,现在看到了 - 非常感谢
    【解决方案2】:

    实际上,我也在尝试另一种并行方法(如 B 计划),即使用 mongoexport。我将它与 --csv 一起使用以转储仅包含 (id, ip) 字段的大型 csv 文件。然后计划是使用python脚本进行geoip查找,然后作为新文档发回mongo,现在可以在该文档上运行map-reduce进行计数等。不确定这是更快还是光标是。我们拭目以待。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-14
      • 2011-02-13
      • 2015-07-20
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      相关资源
      最近更新 更多