【问题标题】:How to delete mass records using Map/reduce script?如何使用 Map/reduce 脚本删除大量记录?
【发布时间】:2018-07-12 11:33:43
【问题描述】:

我创建了一个 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 条记录?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 是的,这可能行得通。但我试图测试我们是否可以在 Map/reduce 中做到这一点。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      4k 记录语法是:

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

      最后,我通常会按照预定的大规模更新来执行此操作。它将倾向于减少对任何生产计划和映射/减少脚本的干扰。

      /**
       * @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
          };
      });
      

      【讨论】:

      • 是的,在 Map/reduce 中,这就是我所做的,以获得 4k 条记录。但问题是首先它会创建保存的搜索返回 400 万条记录。这将需要很多时间。创建保存的搜索后,它将将前 4k 条记录返回到下一阶段。我正在寻找在搜索创建期间过滤结果,search.filter 中的任何内容
      • 如果你只是创建并返回搜索对象。不要运行搜索。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-21
      相关资源
      最近更新 更多