我有一個數據庫附加到4個森林,我想在每次文檔中的任何值更改時在MarkLgic中創建一個更改文檔。更改文件應包含更改日期,舊值和新值。使用MLCP加載數據時發生XDMP-NEWSTAMP錯誤
我能夠通過使用預先提交和提交後觸發器來完成該操作。 預提交觸發器捕獲文檔的舊版本,提交後具有新版本。我比較這兩個文檔並創建更改文檔。 這在更新單個文檔時效果很好。
但是,我通過使用MLCP從分隔文件加載20000文檔來測試此解決方案。我改變了所有文檔中單個元素的值,然後再次加載數據。 我的觸發器只能捕獲20000個已更改文檔中的7000個。該文件的其餘部分加載失敗,我收到MLCP一個錯誤,說:
「XDMP-NEWSTAMP時間戳太新森林」
我也從刪除我的代碼另一個測試預提交和提交後觸發器,並使觸發器不執行任何操作。我再次加載文件。現在19000/20000文檔已成功更新,並且出現相同的XDMP-NEWSTAMP錯誤。
當我完全刪除觸發器並加載文檔。 20000/20000會被加載和更新。
所以它看起來像執行大量的觸發器,加載文件時產生問題。
有沒有解決這個問題的方法? 我會走錯路去完成我需要做的事情嗎?
MLCP命令: mlcp import -host localhost -port 8000 -username uname -password pwd -input_file_path D:.... \ file.dsv -delimiter'|' -input_file_type delimited_text -database加班-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{ " '' "})
你是否指定時間戳?請發佈您正在使用的MLCP命令,並提供有關觸發器操作的更多信息。 – wst
我遇到過使用帶觸發器的mlcp的類似問題。就像你自己所說的那樣,即使觸發器是空的,mlcp速度非常快,MarkLogic也難以跟上。我有興趣聽到最好的解決方案。作爲一種解決方法,您可以將mlcp作業拆分爲更小的批次,然後等待MarkLogic完成。 – chriskelly
@wst不,我沒有指定時間戳,我在這個問題中增加了更多細節。 – user3916117