使用專用的 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 示例中提供了更多示例