我只想查找林中的所有文档名称。
我知道森林名称(ABC),我需要找到该森林中的所有文件(ABC)。我的出局应该是这样的。
Forest ABC已经
A.xml
B.xml
C.xml
依旧......
答案 0 :(得分:4)
搜索和词典查找可以受到林的限制,因此您应该能够通过类似以下的调用从URI词典中获取文档名称:
cts.values(cts.uriReference(), null, null, null, null, xdmp.forest('ABC'))
也就是说,查找森林中文档名称的共同动机并不多。你想要完成什么?
答案 1 :(得分:2)
为了列出特定林中的所有URI,您可以使用cts:uris()
并在第5个参数中指定forest-id:
cts:uris((), (), cts:true-query(), (), xdmp:forest("ABC"))
您的评论建议您尝试列出特定林中的所有URI的原因是您可以删除重复的URI。
下面的代码可用于从指定的林中获取所有URI,如果它们是重复的,则从该林中删除它们。
如果您尝试读取文档属性并抛出 XDMP-DBDUPURI 异常,请捕获该异常,然后从问题林中删除不同事务中的文档。
(: update this with the name of problem forest :)
declare variable $PROBLEM-FOREST := xdmp:forest("ABC");
declare variable $URIS := cts:uris((), (), cts:true-query(), (), $PROBLEM-FOREST);
for $uri in $URIS
return
try {
let $properties := xdmp:document-get-properties($uri, xs:QName("foo"))
return ()
} catch($e) {
if ($e/error:code = "XDMP-DBDUPURI") then
xdmp:invoke-function(
function(){ xdmp:document-delete($uri) },
<options xmlns="xdmp:eval">
<isolation>different-transaction</isolation>
<database>{$PROBLEM-FOREST}</database>
</options>
)
else ()
}
根据此林中的文档数量,您可能会遇到超时问题。您可以考虑将此作为CORB job运行,其中在 URIS-MODULE 中选择了forsts URI,然后在 PROCESS-MODULE