我可以使用下面的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?
答案 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"));