如何使用Map / reduce脚本删除海量记录?

时间:2018-07-12 11:33:43

标签: mapreduce netsuite suitescript suitescript2.0 saved-searches

我创建了一个Map / Reduce脚本,它将获取客户发票并将其删除。如果我根据以下条件在UI中创建保存的搜索,则会显示400万条记录。现在,如果我运行脚本,则在完成“ getInputData”阶段之前,执行将停止,因为此阶段的最大存储限制为200Mb。因此,我想从400万个记录中提取4000条记录,并执行它,并每15分钟安排一次脚本。这是第一阶段的代码(getInputData)-

            var count=0;
                var counter=0;
                var result=[];
                var testSearch = search.create({
                    type: 'customrecord1',
                    filters: [ 'custrecord_date_created', 'notonorafter', 'sta​rtO​fLa​stM​ont​h' ],
                    columns: [ 'internalid' ]
                }); 
                do{
                    var resultSearch = testSearch.run().getRange({
                        start : count,
                        end   : count+1000
                    });
                    for(var arr=0;arr<resultSearch.length;arr++){
                        result.push(resultSearch[arr]);
                    }
                    counter = count+counter;                        
                }while(resultSearch.length >= 1000 && counter != 4000);
                return result;

在创建保存的搜索过程中,这会花费很长时间,是否有任何方法可以解决在创建保存的搜索过程中可以过滤掉前4000条记录的问题?

3 个答案:

答案 0 :(得分:2)

为什么不进行自定义批量更新?

这将是一个5到10行的脚本,它将按照批量更新的标准获取当前记录的内部ID和记录类型,然后删除该记录。

答案 1 :(得分:0)

我相信这就是search.runPaged()pagedData.fetch()的目的。

search.runPaged运行当前搜索并返回有关分页结果的摘要信息-它不会为您提供结果集或保存搜索。

pagedData.fetch检索指定页面范围内的数据。

答案 2 :(得分:0)

如果您打算使用Map / Reduce,则可以只返回创建的搜索。 Netsuite将运行它,并将每一行传递到下一阶段。您甚至可以使用保存的搜索来限制行数,然后在汇总阶段重新触发脚本(如果还有什么要做的话)。

4k记录语法为:

var toDelete = [];
search.run().each(function(r){
    toDelete.push(r.id); 
    return toDelete.length < 4000;
});
return toDelete;

最后,我通常按计划进行批量更新。它将倾向于减少对任何计划的生产和map / reduce脚本的干扰。

/**
 * @NApiVersion 2.x
 * @NScriptType MassUpdateScript
 */
define(["N/log", "N/record"], function (log, record) {
    function each(params) {
        try {
            record.delete({
                type: params.type,
                id: params.id
            });
            log.audit({ title: 'deleted ' + params.type + ' ' + params.id, details: '' });
        }
        catch (e) {
            log.error({ title: 'deleting: ' + params.type + ' ' + params.id, details: (e.message || e.toString()) + (e.getStackTrace ? (' \n \n' + e.getStackTrace().join(' \n')) : '') });
        }
    }
    return {
        each:each
    };
});