gpt4 book ai didi

mongoDB map/reduce 减去 reduce

转载 作者:IT老高 更新时间:2023-10-28 13:06:28 28 4
gpt4 key购买 nike

我有一些 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 中的文档顺序不同。

最佳答案

当使用 map/reduce 时,你总是会得到

{ "value" : { <reduced data> } }

为了删除 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 });

关于mongoDB map/reduce 减去 reduce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3581058/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com