在Marklogic Javascript中实现For循环?

时间:2018-01-17 18:37:04

标签: javascript marklogic sjs

我可以使用下面的XQuery获取集合中文档的所有URI:

for $doc in fn:collection("transform") 
return xdmp:node-uri($doc)

但是,当我尝试在MarkLogic的Javascript模块中实现它时,它只获取数据库集合中的最后一个文档。

'use strict';
declareUpdate()
var docs = fn.collection("transform");
for(var doc of docs) {
  xdmp.nodeUri(doc)
}

它没有给出集合中的所有URI,而是仅返回文档的最后一个URI。

如何让它返回所有URI?

2 个答案:

答案 0 :(得分:1)

没有一个答案可以解释为什么他们解决原始问题,或核心误解是什么。它们是正确的答案,但其原因并不明显。

原始代码没有问题,除了JavaScript返回评估表达式的错误假设。

LAST评估表达式是从JavaScript脚本'返回的。

这不同于XQuery,其中表达式累积到返回的序列中。

试试这个简单的案例:

'use strict;'
var i = 0
i++
i++
i++

结果:

2

不是

[ 0 , 1 , 2 ]

这并不意味着它没有执行' "我++" 3次,表示结果值是最后一次。

尝试更改原始代码,但循环中除了“做某事”之外'这有一些可见的结果 - 比如说Console.log()

'use strict';
declareUpdate()
var docs = fn.collection("transform");
for(var doc of docs) {
  Console.log(xdmp.nodeUri(doc))
}

然后查看8000_ErrorLog.txt(V9)的ErrorLog.txt(V8) 您将看到每个URI的条目。

这就是为什么建议将值放入数组中,因为你问过"我怎样才能让它返回所有的URI?" - 那就是你怎么做的。

然而问题是"有没有办法直接阅读uri而不是推入数组"完全不同。您现有的代码目前正在这样做。你只是没有看到'这是因为你没有对URI做任何事情,而是把它丢弃在地板上

当您添加代码以执行您想要对URI(或节点)执行的操作时,它将逐个执行,而不必先加载整个序列。

试试吧。

答案 1 :(得分:0)

创建一个数组并在for循环中将每个URI添加到该数组,然后返回数组:

'use strict';
declareUpdate()
var docs = fn.collection("transform");
var results = [];
for (var doc of docs) {
 results.push(xdmp.nodeUri(doc));
}
results;

或使用Sequence

返回 Sequence.from()
'use strict';
declareUpdate()
var docs = fn.collection("transform");
var results = [];
for (var doc of docs) {
 results.push(xdmp.nodeUri(doc));
}
Sequence.from(results);

但是,如果您只想返回URI,那么cts.uris()使用cts.collectionQuery()会更好/更容易:

'use strict';
declareUpdate();
cts.uris("", null, cts.collectionQuery("transform"));