2012-04-04 44 views
3

我試圖通過集合更新作爲範圍變量 - 沒有骰子。 我試圖從身體的finalize調用db.getCollection - 沒有骰子,我得到這個:是否可以從map reduce引擎的finalize方法更新mongo集合?

db assertion failure, assertion: 'invoke failed: JS Error: TypeError: db has no properties nofile_b:18', assertionCode: 9004 

我想這意味着db是一個finalize方法中不確定的。那麼,有可能嗎?

編輯

這裏是我的finalize方法:

function(key, value) { 
    function flatten(value, collector) { 
    var items = value; 
    if (!(value instanceof Array)) { 
     if (!value.items) { 
     collector.push(value); 
     return; 
     } 

     items = value.items; 
    } 
    for (var i = 0; i < items.length && collector.length < max_group_size; ++i) { 
     flatten(items[i], collector); 
    } 
    } 

    var collector = []; 
    flatten(value, collector); 
    return collector; 
} 

我想與插入替換collector.push(value)到一些收藏。

+0

你的代碼是什麼? – 2012-04-04 08:22:16

回答

2

無法從Map/Reduce/Finalize函數中修改另一個集合。

這裏是帶有類似問題的用戶提問的鏈接。不幸的是,答案是「不」。
How to change the structure of MongoDB's map-reduce results?

部分原因是MapReduce被設計爲在分片環境中工作。計算分佈在不同的分片中,然後將結果彙總。如果每個分片上運行的每個函數都被允許修改集合,那麼每個分片最終可能會包含不同的數據。

如果您希望單獨的集合因Map Reduce操作而被修改,最好的策略是運行Map Reduce操作,獲取結果,然後讓應用程序更新單獨的集合。

如果您想要合併多個Map Reduce操作的結果,可以通過增量Map Reduce來完成此操作。關於此的文檔可能在這裏找到:http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-IncrementalMapreduce

相關問題