ドキュメントの (適度に複雑な) セクションがデータベースで変更されたときに、古い値と新しい値の違いを保存するというログ要件があります。変更されたデータのみを報告する必要があります。現在のソリューションはかなりうまく機能しますが、最適ではなく、更新が大量に発生し始めるとパフォーマンスの問題が発生する可能性があるという懸念があります。
私の現在のソリューションは、主に次のようになります。
for $element in $data/section//element()[text()]
return
if (not($old-data//*[fn:name() = fn:name($element) and text() = $element/text()])) then
element log:difference {
...
}
else ()
//*[fn:name() = fn:name($element)]
私の問題は、コンストラクトがもたらす何千もの比較を行うと、(比較的) 長い時間がかかることをプロファイラーが示していることです。ほんの数十ミリ秒ですが、多くの更新が追加されるため、それを回避する方法があるはずだと感じています.
xml の構造は十分に明確に定義されているため、1 つのドキュメントのフィールドが他のドキュメントと同じ相対 xpath を持つことを確認できます。したがって、技術的には//
、手動で xml ツリーをたどるという犠牲を払って、 の使用を削除できます。しかし、それはかなりの複雑さであり、構造はかなりフラットなので、はるかに効率的かどうかはわかりません.
また、ドキュメントのこのセクションに含めることができるフィールドのセットは限られているため、それぞれを手動で (完全修飾された xpath を使用して) 順番に比較することもできますが、それは避けたいと思います。フィールドのリストが変更された場合に、将来このコードを再検討する必要がないことをお勧めします。
解決策はそれらの線に沿ったものになるのでしょうか、それとも私が見逃したもっと明白なものがありますか?
述語を使用せずに要素名の文字列値を直接使用して xpath を構築する方法はありますか? 通常、xpath の評価にはそれほど時間がかからないため、そのほうが効率的だと思います。
おそらく、要素の相対 xpath を抽出して、他のドキュメントの正確な場所を調べることはできますか?
marklogic 自体に組み込みの xml 比較ツールがありませんか?