我有一些25k文件(原始json中为4 GB)的数据,我想执行一些javascript操作,使我的终端数据使用者(R
)更容易访问,我想对这些更改进行"版本控制"通过为每个更改添加一个新集合,但我无法弄清楚如何map/reduce
没有reduce
.我想要一对一的文档映射 - 我开始使用25,356个文档collection_1
,我希望最终得到25,356个文档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
我的mapper中的调用参数不等于我的返回参数reducer
.另外,我最终得到了一份文件
{ "_id": "0xWH4T3V3R", "value": { "key": { "finally": ["here"], "thisIsWhatIWanted": ["Yes!"] } } }
这似乎没必要.
此外,执行自己的插入的游标甚至不到十分之一mapReduce
.我不太了解MongoDB对它进行基准测试,但我猜它会50x
慢一些.有没有办法并行运行游标?我不在乎我的文件是否与其中的文件collection_2
顺序不同collection_1
.
当使用map/reduce时,你总会最终得到
{ "value" : {} }
要删除value
密钥,您必须使用一个finalize
功能.
这是将数据从一个集合复制到另一个集合的最简单方法:
map = function() { emit(this._id, this ); } reduce = function(key, values) { return values[0]; } finalize = function(key, value) { db.collection_2.insert(value); }
那么当你正常运行时:
db.collection_1.mapReduce(map, reduce, { finalize: finalize });