对于冗长的描述,我们深表歉意。
我想对一个大型 Mongodb 集合中的每个文档运行一个转换,其中包含 1000 万条记录,大约 10G。具体来说,我想对每个文档中的 ip 字段应用一个 geoip 转换,然后将结果记录附加到该文档,或者只是创建一个通过 say id 链接到该文档的其他记录(链接并不重要,我可以创建一个整个单独的记录)。然后我想按城市进行计数和分组 - (我确实知道如何做最后一部分)。
我认为我不能使用 map-reduce 的主要原因是我不能在我的 map 函数中调用 geoip 库(或者至少这是我认为存在的约束)。
所以我的核心问题是如何遍历集合中的每条记录并应用转换 - 使用最有效的方法来做到这一点。
通过 Limit/skip 进行批处理是不可能的,因为它会进行“表扫描”,并且会逐渐变慢。
有什么建议吗?
Python 或 Js 更受欢迎,因为我有这些 geoip 库,但欢迎使用其他语言的代码示例。
最佳答案
因为你必须遍历“每条记录”,你无论如何都要进行一次全表扫描,然后是一个简单的游标(find()
)+可能只获取几个字段(_id,ip ) 应该这样做。 python 驱动程序将在后台进行批处理,因此如果默认值不够好,您可以提示最佳批处理大小 (batch_size
) 是多少。
如果您添加了一个新字段并且它不适合先前分配的空间,mongo 将不得不将其移动到另一个地方,因此您最好创建一个新文档。
关于python - 如何在没有 map/reduce 的情况下转换大型 Mongodb 集合中的每个文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8663432/