從版本2.4開始,MongoDB使用V8引擎,即ECMA-262第5版。當在外殼內部運行MapReduce作業時,還有一個額外的supported function的列表。MongoDB中的map和/或reduce函數中有哪些「種類」的JavaScript可用?
如果我使用本地Node.js驅動程序運行mapReduce作業?我可以使用map
和reduce
中的任何模塊或JavaScript函數嗎?
編輯:我現在無法做一些測試來弄清楚,但我會盡快更新這個問題。
從版本2.4開始,MongoDB使用V8引擎,即ECMA-262第5版。當在外殼內部運行MapReduce作業時,還有一個額外的supported function的列表。MongoDB中的map和/或reduce函數中有哪些「種類」的JavaScript可用?
如果我使用本地Node.js驅動程序運行mapReduce作業?我可以使用map
和reduce
中的任何模塊或JavaScript函數嗎?
編輯:我現在無法做一些測試來弄清楚,但我會盡快更新這個問題。
MapReduce在MongoDB實例中運行。
您現在無法使用任何其他編程語言或平臺來創建MapReduce。你可以模擬我想的概念,但它意味着所有的數據都被傳輸到你的應用程序等。
函數的主體通過調用從Node.JS進程轉移到MongoDB(和分片等) toString
在提供的map
功能(見here)。
if ('function' === typeof map) {
map = map.toString();
}
你可以在map
功能嵌入功能,但你要確認的性能滿足您的需求的功能複雜度的增加。但是,它仍然僅限於您傳遞的函數,並且無法訪問可能正在執行的Node.JS中的其他腳本。
編輯:
此外,您還可以使用mapReduce
調用的參數scope
附加額外的功能。例如,如果你通過了scope
爲:
{ add10: function(v) { return v + 10; } }
的函數調用add10
將在map
調用可用的(以及reduce
和finalize
功能):
var fancyMath = add10(this.total);
因此,使用該技術,你可以通過一些有限的功能。它確實被序列化爲BSON併發送到MongoDB服務器,因此它需要是獨立的(並且不引用其他本地不可用的JavaScript函數)。
很好,謝謝。用'scope'參數傳遞一個Node模塊怎麼樣? – gremo
@Gremo將無法工作,該模塊將被序列化爲BSON,並且不會在另一端反序列化 – Sammaye
@Gremo - 你想做什麼?無論如何,你一次只能訪問一個文檔......(我擔心你試圖在MapReduce中做太多)。 – WiredPrairie