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