2

我可以使用以下 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?

4

2 回答 2

1

没有一个答案能解释他们为什么要解决起源问题,或者核心误解是什么。它们是正确的答案,但原因并不明显。

除了错误地假设 JavaScript 如何返回计算表达式之外,原始代码没有任何问题。

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

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

试试这个简单的案例:

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

结果:

2

不是

[ 0 , 1 , 2 ]

这并不意味着它没有“执行”“i++”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(或节点)执行任何您想要执行的操作时,它将一个一个地执行,而无需先加载整个序列。

试试看。

于 2018-01-21T13:14:46.737 回答
1

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

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

或使用返回序列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()与 a一起使用会更好/更容易cts.collectionQuery()

'use strict';
declareUpdate();
cts.uris("", null, cts.collectionQuery("transform"));
于 2018-01-18T00:36:38.997 回答