当我在Mongo数据库上运行Map-Reduce时,我通常会得到类似于以下内容的结果:
{ _id: <some-id>, value: { <first-key>: <first-value>, ... } }
有没有办法省略value: { ... }
部分并直接在结果中插入value
的内容?基本上,我希望得到如下结果:
{ _id: <some-id>, <first-key>: <first-value>, ... }
这样我就可以将结果合并回一个遵循这种格式的现有集合。
我还有一个关于Map-Reduce的问题:是否可以通过map
或reduce
函数访问另一个集合?
答案 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' } }] }
以上操作无效,取决于您使用的驱动程序,您将获得范围错误,并告知已超出最大通话大小或类似情况。坚持范围内的简单对象将使生活变得简单。