MarkLogic跨库复制文档后如何删除成功内容并留存失败文档
MarkLogic跨库复制后按复制结果删除源文档方案
核心实现思路
通过异常捕获机制区分复制成功/失败的文档:
- 跨库插入操作正常执行无报错时,判定为复制成功,删除源库对应文档
- 跨库插入抛出异常(包括目标库模板校验失败、规则冲突等所有插入阶段错误)时,判定为复制失败,保留源库对应文档,同时收集失败文档URI供后续排查
修改后可用的XQuery代码
xquery version "1.0-ml"; let $target-db := "STAGING" (: 初始化成功、失败文档URI列表 :) let $success-list := () let $fail-list := () let $invoke-opts := <options xmlns="xdmp:eval"> <database>{xdmp:database($target-db)}</database> <commit>auto</commit> <isolation>different-transaction</isolation> </options> let $process-result := for $doc in cts:search(doc(), cts:collection-query('Collection1')) let $doc-uri := $doc/base-uri() let $doc-collections := xdmp:document-get-collections($doc-uri) let $doc-permissions := xdmp:document-get-permissions($doc-uri) let $insert-opts := <options xmlns="xdmp:document-insert"> <permissions>{$doc-permissions}</permissions> <collections> <collection>{$doc-collections}</collection> </collections> </options> return try { (: 执行跨库插入 :) xdmp:invoke-function( function() { xdmp:document-insert($doc-uri, $doc, $insert-opts) }, $invoke-opts ), (: 插入成功则删除源文档,记录成功URI :) xdmp:document-delete($doc-uri), $success-list := ($success-list, $doc-uri) } catch ($err) { (: 任意插入错误(含模板错误)都记录失败URI,不删除源文档 :) $fail-list := ($fail-list, $doc-uri) } return <copy-result> <total-processed>{count($success-list) + count($fail-list)}</total-processed> <success-count>{count($success-list)}</success-count> <failed-count>{count($fail-list)}</failed-count> <failed-document-uris>{$fail-list}</failed-document-uris> </copy-result>
关键配置说明
- 跨库调用选项中添加
<isolation>different-transaction</isolation>,保证目标库插入事务和源库删除事务完全独立,不会出现目标端插入回滚但源端误删文档的问题 catch块会捕获插入阶段所有类型的异常,不需要单独枚举模板相关的错误码,只要插入流程报错就会自动留存源文档- 脚本执行完成后返回结果中的
<failed-document-uris>节点就是所有复制失败的文档列表,可直接用于排查目标库模板配置问题
内容的提问来源于stack exchange,提问作者Rashmita Purkayastha
相关产品推荐
相关产品推荐

