我有大约 25k 个文档(原始json格式,大小为4 GB),想对它们进行一些JavaScript操作,以使最终的数据消费方(R
)能够更加方便地获取数据。我希望通过为每次更改添加一个新集合来“版本控制”这些更改,但是如果没有 reduce
,我无法弄清楚如何进行 map/reduce
。我需要一对一文档映射-在collection_1
中开始时有25356个文档,最终想以同样的数量,在collection_2
中结束。
我可以用以下方法来解决:
var reducer = function(key, value_array) {
return {key: value_array[0]}
}
然后像这样调用:
db.flat_1.mapReduce(mapper, reducer, {keeptemp: true, out: 'flat_2'})
(我的映射器只调用一次emit,第一个参数是字符串,第二个参数是最终文档。我真正想要的是这些第二个参数的集合。)
但这似乎很笨拙,而且我不知道为什么它甚至能工作,因为我的映射器中emit调用的参数与我的reducer返回的参数不等同。此外,最终我得到了这样一个文档:
{
"_id": "0xWH4T3V3R",
"value": {
"key": {
"finally": ["here"],
"thisIsWhatIWanted": ["Yes!"]
}
}
}
这似乎是不必要的。
此外,执行自己插入的光标甚至不到 mapReduce
的十分之一快。我不太了解 MongoDB,无法进行基准测试,但我猜测它大约慢了 50x
。有没有一种方法可以并行地遍历光标?如果我 collection_2
中的文档与 collection_1
中的文档顺序不同,我也不介意。