我有一个连接到4个林的数据库,每次文档中的任何值发生更改时,我都想在MarkLgic中创建一个更改文档。变更文档应包含变更日期、旧值和新值。
我能够通过使用提交前和提交后触发器来实现这一点。提交前触发器捕获文档的旧版本,提交后触发器具有新版本。我比较这两个文档并创建更改文档。这在更新单个文档时效果良好。
但是,我通过从一个分隔文件加载带有MLCP的20000文档来测试这个解决方案。我更改了所有文档中单个元素的值,并再次加载了数据。我的触发器只能捕获20000个更改文档中的7000个。其余的文件无法加载,我在MLCP中收到一个错误,上面写着:
"XDMP-NEWSTAMP时间戳对于林来说太新"
我做了另一个测试,从提交前和提交后触发器中删除了我的代码,让触发器什么都不做。我重新加载了文件。现在19000/20000个文档已成功更新,我收到了相同的XDMP-NEWSTAMP错误。
当我完全删除触发器并加载文档时。20000/20000加载并更新。
因此,它似乎执行了大量的触发器,在加载文档时会产生问题。
这个问题有解决办法吗?为了完成我需要做的事情,我是不是走错了路?
MLCP命令:mlcp import-主机localhost-端口8000-用户名uname-密码pwd-输入文件路径D:。。。。\file.dsv-分隔符'|'-input_file_type delimited_text-数据库加班-output_collections测试
创建触发器:
xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
import module namespace trgr="http://marklogic.com/xdmp/triggers" at "/MarkLogic/triggers.xqy";
trgr:create-trigger("PreCommitTrigger", "Trigger that fires when a document is updated",
trgr:trigger-data-event(
trgr:collection-scope("test"),
trgr:document-content("modify"),
trgr:pre-commit()),
trgr:trigger-module(xdmp:database("Overtime"), "/", "preCommit.xqy"),
fn:true(), xdmp:default-permissions()),
trgr:create-trigger("PostCommitTrigger", "Trigger that fires when a document is updated",
trgr:trigger-data-event(
trgr:collection-scope("test"),
trgr:document-content("modify"),
trgr:post-commit()),
trgr:trigger-module(xdmp:database("Overtime"), "/", "postCommit.xqy"),
fn:true(), xdmp:default-permissions())
加载触发文件:
xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
xdmp:document-insert('/preCommit.xqy',
text{ " '' "}).
xdmp:document-insert('/postCommit.xqy',
text{ " '' "})
MarkLogic有CPF(内容处理框架-https://docs.marklogic.com/guide/cpf/quickStart?hq=CPF)这将帮助您对文件进行任何转换,在这种情况下,您可以有一个工作流来管理插入的任何文件,分析文件并创建DLS(https://docs.marklogic.com/dls)DLS是一个允许您控制文件版本的库,我想这就是您想要做的。希望它能帮助您。