使用專用的 MapReduce 指令碼
對於非常大的搜尋結果,你可以使用專用的 Map / Reduce 指令碼。它更加不方便,但有時是不可避免的。有時可能非常方便。
這裡的技巧是,在 Get Input Data 階段,你可以向 NS 引擎提供實際資料(即指令碼結果),而不僅僅是搜尋的定義。NS 將在不計算治理單位的情況下為你執行搜尋。然後每個結果行將傳遞給 Map 階段。
當然,存在一個限制:map / reduce 指令碼的總持久資料大小不允許超過 50MB。在搜尋結果中,每個鍵和每個值的序列化大小都計入總大小。 序列化表示搜尋結果行使用 JSON.stringify 轉換為字串。因此,值大小與結果集中的搜尋結果列的數量成比例。如果你遇到 STORAGE_SIZE_EXCEEDED 錯誤,請考慮減少列,組合公式,將結果分組,甚至將搜尋拆分為多個子搜尋,這些搜尋可以在 Map 或 Reduce 階段執行。
/**
* @NApiVersion 2.0
* @NScriptType MapReduceScript
*/
define(['N/search'], function(search) {
function getInputData()
{
return search.create({
type: search.Type.TRANSACTION,
columns : ['entity','amount'],
filters : []
});
}
function map(context)
{
var searchResult = JSON.parse(context.value);
// you have the result row. use it like this....
var transId = searchResult.id;
var entityId = searchResult.values.entity.value;
var entityName = searchResult.values.entity.text;
var amount = searchResult.values.amount.value;
// if you want to pass some part of the search result to the next stage
// write it to context:
context.write(entityId, transId);
}
function reduce(context)
{
// your code here ...
}
function summarize(summary)
{
// your code here ...
}
return {
getInputData: getInputData,
map: map,
reduce: reduce,
summarize: summarize
};
});
當然,這裡的示例是簡化的,沒有錯誤處理,只是為了與其他人進行比較。 NS 幫助中心的 Map / Reduce Script Type 示例中提供了更多示例