如何更改MongoDB mapreduce结果的结构?

时间:2011-12-07 13:42:53

标签: mongodb mapreduce

当我在Mongo数据库上运行Map-Reduce时,我通常会得到类似于以下内容的结果:

{ _id: <some-id>, value: { <first-key>: <first-value>, ... } }

有没有办法省略value: { ... }部分并直接在结果中插入value的内容?基本上,我希望得到如下结果:

{ _id: <some-id>, <first-key>: <first-value>, ... }

这样我就可以将结果合并回一个遵循这种格式的现有集合。

我还有一个关于Map-Reduce的问题:是否可以通过mapreduce函数访问另一个集合?

3 个答案:

答案 0 :(得分:6)

MapReduce只返回{_id:some_id,value:some_value}

形式的文档

“some_value”不一定必须是嵌入式文档,但在大多数情况下,它允许通过Map Reduce函数计算多个变量。 Reduce函数返回的文档必须与输入的格式相同,因为Reduce函数可能会针对任何给定的_id值重复运行。

有关Map Reduce如何工作的逐步说明,请参阅MongoDB Cookbook食谱的“Extras”部分,标题为“使用版本化文档查找最大值和最小值”http://cookbook.mongodb.org/patterns/finding_max_and_min/这应该提供更好的理解Map Reduce如何工作,以及输出必须采用{_id:some_id,value:some_value}

格式的原因

可以进行增量Map Reduce,它将合并多个Map Reduce函数的结果。 http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-IncrementalMapreduce

最后,目前无法使用Map Reduce一次访问多个集合。此功能有一项功能请求,但未计划添加到任何即将发布的版本中 https://jira.mongodb.org/browse/SERVER-970

答案 1 :(得分:0)

这对我有用:
假设您在地图中发出this或其变体,请先设置this._id = undefined 设置要合并的模式。

检查我的示例here

答案 2 :(得分:0)

RE:从Map / Reduce函数中访问其他集合。您可以做的是利用“范围”在执行期间推送m / r所需的数据。注意:scope仅接受SIMPLE对象集合。简单来说,我的意思是没有嵌套文档。

scope = { People : [{ Name : 'bob', Color : 'blue'}, { Name : 'sally', Color: 'orange'}] }

以上范围集合正常。在m / r函数中,只需将'People'称为全局变量,您就可以遍历您的集合等。

scope = { People : [{ Name : 'bob', Color : { Favorite : 'blue'} }, { Name : 'sally', Color : { Favorite : 'orange' } }] }

以上操作无效,取决于您使用的驱动程序,您将获得范围错误,并告知已超出最大通话大小或类似情况。坚持范围内的简单对象将使生活变得简单。