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