Marklogic CORB在CSV中写更少的文件?

Marklogic CORB在CSV中写更少的文件?,marklogic,marklogic-corb,Marklogic,Marklogic Corb,我正在运行CORB将数据转换为CSV。当我使用THREAD-COUNT-1运行时,它工作得非常好,这意味着我在CSV文件中获得了所有文件输出。但当我增加线程大小和批处理大小时,CSV文件中显示的输出文件数量会减少。我不知道为什么 下面是我的属性文件 THREAD-COUNT=5 BATCH-SIZE=10 URIS-MODULE=selector.sjs|ADHOC PROCESS-MODULE=transform.sjs|ADHOC PROCESS-TASK=com.marklogic.dev

我正在运行CORB将数据转换为CSV。当我使用
THREAD-COUNT-1
运行时,它工作得非常好,这意味着我在CSV文件中获得了所有文件输出。但当我增加线程大小和批处理大小时,CSV文件中显示的输出文件数量会减少。我不知道为什么

下面是我的属性文件

THREAD-COUNT=5
BATCH-SIZE=10
URIS-MODULE=selector.sjs|ADHOC
PROCESS-MODULE=transform.sjs|ADHOC
PROCESS-TASK=com.marklogic.developer.corb.ExportBatchToFileTask
EXPORT-FILE-NAME=HelloWorldReport.csv
PRE-BATCH-TASK=com.marklogic.developer.corb.PreBatchUpdateFileTask
EXPORT-FILE-TOP-CONTENT=a,b,c,d,e,uri
但是在CORB命令提示符中,我可以看到所有的URI。但当写入CSV时,它只返回了很少的内容

我遵循了设置选择器和转换模块的步骤。下面是我的selector.sjs模块

var total = cts.uris("", null, cts.collectionQuery("data"));
fn.insertBefore(total,0,fn.count(total))
在我的transform.sjs中,我从文档中获取元素,然后连接它们

var name = fn.tokenize(URI, ";");
for ( var uri of name) {
let obj = fn.head(fn.doc(uri)).toObject();
var a = obj.Name;
var b = obj.Country;
var c = obj.State;
var d = obj.Code;
var e = obj.University;
fn.concat(a,b,c,d,e,uri);
}
Marklogic中是否有任何函数用于在值之间保留分隔符(即,在上面的
fn.concat
中,我将连接所有字符串(abcdeuri),但我想用
(a,b,c,d,e,uri)分隔每个字符串。我尝试使用
fn.stringJoin
,但无法向其中发送三个以上的值)

感谢您的帮助

谢谢

问题是。您正在for循环内部生成字符串,因此当您将批大小设置为大于1时,只返回for循环中的最后一项

您可以增加线程数,并保持批大小=1,并且应在不更改流程模块的情况下获得所需的输出

为了让流程模块返回批大小大于1的所需结果,您需要在处理for循环内部的数据时收集结果,然后返回for循环外部的所有数据。您可以通过推入数组变量来收集数据,然后使用返回字符串序列

您可以使用该函数生成CSV。第一个参数是可以放入数组的值序列,第二个参数是要与之联接的值

var URI;
var name = fn.tokenize(URI, ";");
var results = [];
for ( var uri of name) {
let obj = fn.head(fn.doc(uri)).toObject();
var a = obj.Name;
var b = obj.Country;
var c = obj.State;
var d = obj.Code;
var e = obj.University;
results.push(fn.stringJoin([a,b,c,d,e,uri], ","));
}
Sequence.from(results);

感谢@Hansen,我可以通过声明
constnode
并像这样使用xpath提取
var a=Node.xpath(“/Name”)。这两种方式是否存在性能折衷?我不知道您会看到两种方式之间的显著差异,尤其是当您的文档非常小时。对单个流程模块执行的分析和计时可能不会显示太多差异。找到答案的最简单的方法可能是双向运行CORB作业,看看哪种方式的性能是否更好。我还想指出,asker也有一个例子,其中大部分内容(包括使用外部字符串连接和注释中的进一步解释)如下: