4 つのフォレストに接続されたデータベースがあり、ドキュメントの値が変更されるたびに、MarkLgic で変更ドキュメントを作成したいと考えています。変更文書には、変更日、古い値、および新しい値が含まれている必要があります。
pre-commit トリガーと post-commit トリガーを使用することで、これを実現できました。pre-commit トリガーはドキュメントの古いバージョンをキャプチャし、post-commit は新しいバージョンを保持します。2 つの文書を比較して、変更文書を作成します。これは、単一のドキュメントを更新する場合にうまく機能します。
ただし、区切りファイルから MLCP を含む 20000 ドキュメントをロードして、このソリューションをテストしました。すべてのドキュメントで 1 つの要素の値を変更し、データを再度読み込みました。私のトリガーは、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 Overtime -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{ " '' "})