当前位置:  开发笔记 > 编程语言 > 正文

mongoDB map/reduce减去reduce

如何解决《mongoDBmap/reduce减去reduce》经验,为你挑选了1个好方法。

我有一些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.



1> null..:

当使用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 });


"finalize函数不应出于任何原因访问数据库." - [MongoDB官方文档](http://docs.mongodb.org/manual/reference/command/mapReduce/#mapreduce-finalize-cmd)
推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有