我有一个简单的1节点Marklogic服务器,需要每天清除文档。
下面的测试查询选择文档,然后返回一个序列,我要执行以下操作:
这个结构安全吗?它为每个要删除的文档返回一个序列。返回序列中的最后一项将删除文档。如果上述任何一个步骤失败,是否仍会删除该文档?我应该信任引擎按给定的顺序执行返回序列吗?
xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
let $dateLimitAll := current-dateTime() -xs:dayTimeDuration("P1460D")
let $dateLimitSome := current-dateTime() -xs:dayTimeDuration("P730D")
for $adoc in doc()[1 to 5]
let $docDate := $adoc/Unit/created
let $uri := document-uri($adoc)
let $path:= fn:concat("d:/purge/" , $adoc/Unit/xmldatastore/state/data(), "/", fn:year-from-dateTime($docDate), "/", fn:month-from-dateTime($docDate))
let $filename := fn:concat($path, "/", $uri, ".zip")
where ( ($docDate < $dateLimitAll) or (($docDate < $dateLimitSome) and ($adoc/Unit/xmldatastore/state != "FIRMED") and ($adoc/Unit/xmldatastore/state != "SHIPPED")))
return ( $filename, xdmp:filesystem-directory-create($path, map:new(map:entry("createParents", fn:true()))), xdmp:save($filename, xdmp:zip-create(<parts xmlns="xdmp:zip"><part>{$uri}</part></parts>, doc($uri))), xdmp:document-delete($uri) )
ps请忽略[1到5]文档限制。添加用于测试。
如果上述任何一个步骤失败,是否仍会删除该文档?
如果该模块的执行错误,则事务将回滚,并且从数据库中删除操作将被撤消。
但是,写入文件系统的目录和zip文件将保留并且不会被删除。如果事务回滚,xdmp:filesystem-directory-create()
andxdmp:save()
函数不会回滚或撤消。
我应该信任引擎按给定的顺序执行返回序列吗?
鉴于上述陈述,不确定这有多重要。
这个结构安全吗?
目前尚不清楚你可能要处理多少个文档。你可能会发现使用该过滤器更好/更快,cts:search
并且使用一些索引来定位候选文档。此外,即使你可以选择要更快处理的文档集,但是如果文档很多,你仍然可能会超出执行时间限制。
另一种方法可能是分手工作。选择符合条件的文档的URI,然后对负责保存zip文件和从数据库中删除文档的每个文档分别执行查询。这可能会更快,因为你可以并行处理多个文档,避免了超时的风险,并且在发生异常的情况下,允许某些项目失败而不会导致整个项目失败和回滚。
诸如CoRB之类的工具正是针对此类批处理工作而构建的。
谢谢。如果查询返回5个文档,并且由于文件名错误而无法保存第4个文档,回滚将还原以前删除的3个文档吗?(提交框架缺乏了解。)
数据库更改不会立即执行,而是会排队等待代码完成。如果此时出现任何未捕获的错误,则所有保留在队列中的更改都不会保留。因此,只要您不将xdmp:save包裹在try catch中,如果任何写入失败,任何DB文档都不会被删除。