2011-12-07 43 views
6

當我運行一個蒙戈數據庫上的map-reduce,我通常會得到類似下面的結果:如何更改MongoDB的map-reduce結果?

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

有沒有辦法省略value: { ... }部分,直接插入的value內容的結果?基本上,我想有一個結果,看起來類似如下:

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

這樣我可以在結果合併到現有的集合服從這種格式。

我還有一個關於Map-Reduce的問題:是否可以使用mapreduce函數訪問另一個集合?

+0

可能重複的[在MongoDB mapreduce,我該如何flatten值對象?](http://stackoverflow.com/questions/7257989/in-mongodb-mapreduce-how-can-i-flatten-the-values -目的) –

回答

6

的MapReduce只返回形式的文件{_id:SOME_ID,值:SOME_VALUE}

「SOME_VALUE」不一定非得是嵌入文檔,但在大多數情況下,它是允許通過Map Reduce函數計算多個變量。由Reduce函數返回的文檔必須與它們輸入的格式相同,因爲Reduce函數可以針對任何給定的_id值重複運行。

有關Map Reduce如何工作的詳細步驟,請參閱MongoDB Cookbook配方中「使用版本化文檔查找最大值和最小值」的「其他」部分http://cookbook.mongodb.org/patterns/finding_max_and_min/這應該提供對Map減少工作量,爲什麼輸出格式必須爲{_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

0

這對我有用:
假設你發出this或它在地圖上的變化,首先設置this._id = undefined
設置合併模式。

檢查我的例子here

0

RE:從Map/Reduce函數中訪問其他集合。你可以做的是利用「範圍」在執行期間推送m/r所需的數據。注意:範圍只接受SIMPLE對象集合。簡單來說,我的意思是沒有嵌套的文件。

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

上述範圍集合工作正常。在上午/ R功能僅僅是指「人」作爲一個全局變量,你可以通過你訪問集合等

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

以上是行不通的,這取決於驅動程序你使用,你會得到一個範圍錯誤,並告訴最大呼叫大小已被超過或類似的。在範圍內堅持簡單的對象將使生活變得簡單。