如何使用Map/reduce脚本删除大量记录?
How to delete mass records using Map/reduce script?
我创建了一个 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', 'startOfLastMonth' ],
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 条记录?
我相信这就是 search.runPaged()
and pagedData.fetch()
的目的。
search.runPaged
运行当前搜索和 returns 有关分页结果的摘要信息 - 它不会为您提供结果集或保存搜索。
pagedData.fetch
检索指定页面范围内的数据。
为什么不进行自定义批量更新?
这将是一个 5-10 行的脚本,它在批量更新的条件中获取当前记录的内部 ID 和记录类型,然后删除该记录。
如果您打算 Map/Reduce 您可以 return 您创建的搜索。 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
};
});
我创建了一个 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', 'startOfLastMonth' ],
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 条记录?
我相信这就是 search.runPaged()
and pagedData.fetch()
的目的。
search.runPaged
运行当前搜索和 returns 有关分页结果的摘要信息 - 它不会为您提供结果集或保存搜索。
pagedData.fetch
检索指定页面范围内的数据。
为什么不进行自定义批量更新?
这将是一个 5-10 行的脚本,它在批量更新的条件中获取当前记录的内部 ID 和记录类型,然后删除该记录。
如果您打算 Map/Reduce 您可以 return 您创建的搜索。 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
};
});