我只想找到森林中的所有文档名称。
我知道森林名称(ABC),我需要找到该森林(ABC)中的所有文档。我的输出应该是这样的。
森林ABC有
A.xml
B.xml
C.xml
等等...
我只想找到森林中的所有文档名称。
我知道森林名称(ABC),我需要找到该森林(ABC)中的所有文档。我的输出应该是这样的。
森林ABC有
A.xml
B.xml
C.xml
等等...
搜索和词典查找可以受森林限制,因此您应该能够通过类似于以下的调用从 URI 词典中获取文档名称:
cts.values(cts.uriReference(), null, null, null, null, xdmp.forest('ABC'))
也就是说,在森林中查找文档名称的常见动机并不多。你想达到什么目的?
为了列出来自特定林的所有 URI,您可以cts:uris()
在第 5 个参数中使用并指定林 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 作业运行,其中在URIS-MODULE中选择了 forsts URI ,然后在PROCESS-MODULE中单独处理每个检查/删除。