在 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(或节点)执行的任何操作时,它将一个接一个地执行,而无需先加载整个序列。
试试吧。
我可以使用以下 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(或节点)执行的任何操作时,它将一个接一个地执行,而无需先加载整个序列。
试试吧。