在 Marklogic Javascript 中实现 For 循环?

Implement For Loop in Marklogic Javascript?

我可以使用以下 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,而是仅 return 文档的最后一个 URI。

我怎样才能得到它 return 所有的 URI?

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

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

或return一个Sequence using 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);

但是,如果您只是想 return URI,那么 better/easier 使用 cts.uris() with a cts.collectionQuery():

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

None 的答案解释了为什么他们解决起源问题,或者核心误解是什么。它们是正确答案,但原因不明。

除了 JavaScript returns 如何计算表达式的错误假设外,原始代码没有问题。

最后计算的表达式是从 JavaScript 'script'.

返回的

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

试试这个简单的案例:

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

结果:

2

没有

[ 0 , 1 , 2 ]

不是说没有'execute'"i++"3次,是说结果值是最后一个

除了在具有某种可见结果的循环 'Do Something' 中以外不加改动地尝试您的原始代码——比如 Console.log()

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

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

这就是为什么建议将值放入数组中,因为你问过 "How can I get it to return all of the URIs?" - 你就是这样做的。

然而问题 "Is there any way to read directly the uri's rather than pushing into array" 完全不同。您现有的代码目前正在执行此操作。你只是不 'see' 它因为你没有对 URI 做任何事情但是 'dropping it on the floor'

当您添加代码以执行您想对 URI(或节点)执行的任何操作时,它将一个接一个地执行,而无需先加载整个序列。

试试吧。