【发布时间】:2010-08-27 03:05:03
【问题描述】:
我有一些 25k 文档(原始 json 中为 4 GB)的数据,我想对其执行一些 javascript 操作,以使我的最终数据消费者 (R) 更容易访问它,我想排序通过为每个更改添加一个新集合来“版本控制”这些更改,但如果没有reduce,我无法弄清楚如何map/reduce。我想要一个一对一的文档映射 - 我从 collection_1 中的 25,356 个文档开始,我希望以 collection_2 中的 25,356 个文档结束。
我可以用这个破解它:
var reducer = function(key, value_array) {
return {key: value_array[0]}
}
然后这样称呼它:
db.flat_1.mapReduce(mapper, reducer, {keeptemp: true, out: 'flat_2'})
(我的映射器只调用了一次发射,第一个参数是字符串,第二个参数是最终文档。这是我真正想要的第二个参数的集合。)
但这看起来很尴尬,我不知道它为什么会起作用,因为我的映射器中的emit 调用参数不等于我的reducer 的返回参数。另外,我最终得到了一个像
{
"_id": "0xWH4T3V3R",
"value": {
"key": {
"finally": ["here"],
"thisIsWhatIWanted": ["Yes!"]
}
}
}
这似乎没有必要。
此外,执行自己的插入操作的游标速度甚至不及mapReduce 的十分之一。我不太了解 MongoDB,无法对其进行基准测试,但我猜它大约是 50x 慢。有没有办法并行运行游标?我不在乎我的collection_2 中的文档是否与collection_1 中的文档顺序不同。
【问题讨论】:
-
之所以起作用,是因为你的 emit 和 reducer 调用 是一样的。由于您使用 value[0] 作为减速器的输出,因此它必须完全相同,因为您没有更改它(它只是通过您的减速器)。
标签: mongodb