当我在Mongo数据库上运行Map-Reduce时,我通常会得到类似以下的结果:
{ _id: <some-id>, value: { <first-key>: <first-value>, ... } }
有没有办法省略value: { ... }
部分,直接在结果中插入value
的内容?基本上,我希望得到如下所示的结果:
{ _id: <some-id>, <first-key>: <first-value>, ... }
通过这种方式,我可以将结果合并回遵循此格式的现有集合。
我还有一个关于Map-Reduce的问题:是否有可能从map
或reduce
函数中访问另一个集合?
MapReduce只返回{_id:some_id, value:some_value}形式的文档
"some_value"不一定是嵌入式文档,但在大多数情况下,它允许Map Reduce函数计算多个变量。Reduce函数返回的文档必须与输入文档的格式相同,因为对于任意给定的_id值,Reduce函数可能会重复运行。
对于Map Reduce如何工作的一步一步,请参阅MongoDB食谱的"额外"部分标题为"查找最大和最小值与版本化文档"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
RE:从Map/Reduce函数中访问其他集合。你所能做的就是利用"作用域"在执行过程中将m/r所需的数据推入。注意:scope在这里只接受一个简单的对象集合。简单是指没有嵌套文档。
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' } }] }
以上将不起作用,这取决于你正在使用的驱动程序,你会得到一个范围错误,并告诉最大调用大小已超过或类似的东西。
这对我很有效:
假设您在map中发射this
或其变体,请首先设置this._id = undefined
。
设置出模式合并。
查看我的例子