如何对比MarkLogic数据库中单时态文档(unitemporal document)的不同版本?
检查并对比MarkLogic单时态文档版本差异的方法
1. 获取目标文档的所有版本
单时态集合中,同一逻辑文档的不同版本共享相同URI,可通过MarkLogic内置函数获取完整版本列表:
let $doc-uri := "/path/to/your/temporal-document.xml" -- 获取该URI的所有历史版本 let $all-versions := xdmp:document-get-all-versions($doc-uri) -- 按系统起始时间降序排序(最新版本在前) return fn:sort($all-versions, function($a, $b) { xdmp:document-metadata($a, "system-start-time") gt xdmp:document-metadata($b, "system-start-time") })
如果需要结合文档内的系统起始元素筛选版本(比如指定日期范围),可以用cts:search精准定位:
let $doc-uri := "/path/to/your/temporal-document.xml" let $target-date-range := cts:element-range-query( xs:QName("system-start"), -- 文档内存储系统起始日期的元素 ">=", xs:date("2024-01-01"), "<=", xs:date("2024-06-30") ) return cts:search(fn:doc($doc-uri), $target-date-range)
2. 对比两个版本的内容差异
用内置函数快速生成结构化差异
MarkLogic的xdmp:diff函数可直接对比两个节点,返回标准化的差异结果(包含新增、删除、修改的节点及文本变化):
let $doc-uri := "/path/to/your/temporal-document.xml" let $versions := xdmp:document-get-all-versions($doc-uri) let $latest-version := $versions[1] let $previous-version := $versions[2] -- 返回结构化差异,格式为带diff命名空间的XML节点 return xdmp:diff($latest-version, $previous-version)
xdmp:diff的输出会明确标记每个差异的类型(insert/delete/modify)和位置,方便直接解析或展示。
自定义对比特定元素
如果只关注文档内部分字段的变化,可编写XQuery逻辑针对性对比:
let $doc-uri := "/path/to/your/temporal-document.xml" let $versions := xdmp:document-get-all-versions($doc-uri) let $v1 := $versions[1] let $v2 := $versions[2] return ( "版本时间范围对比:", "V1起始时间: ", xdmp:document-metadata($v1, "system-start-time"), "V1结束时间: ", xdmp:document-metadata($v1, "system-end-time"), "V2起始时间: ", xdmp:document-metadata($v2, "system-start-time"), "V2结束时间: ", xdmp:document-metadata($v2, "system-end-time"), "", "核心字段变化:", "标题: ", if ($v1//title/text() != $v2//title/text()) then fn:concat("[变更] 旧值: ", $v2//title/text(), " → 新值: ", $v1//title/text()) else "[无变化]", "状态: ", if ($v1//status/@code != $v2//status/@code) then fn:concat("[变更] 旧值: ", $v2//status/@code, " → 新值: ", $v1//status/@code) else "[无变化]" )
3. 批量生成版本变更轨迹
要查看文档完整的版本迭代记录,可循环对比相邻版本:
let $doc-uri := "/path/to/your/temporal-document.xml" let $sorted-versions := fn:sort( xdmp:document-get-all-versions($doc-uri), function($a, $b) { xdmp:document-metadata($a, "system-start-time") lt xdmp:document-metadata($b, "system-start-time") } ) return for $i in 1 to fn:count($sorted-versions) - 1 let $curr-version := $sorted-versions[$i] let $next-version := $sorted-versions[$i+1] return ( "=== 版本 ", $i, " → ", $i+1, " ===", "时间区间: ", xdmp:document-metadata($curr-version, "system-start-time"), " 至 ", xdmp:document-metadata($curr-version, "system-end-time"), " → ", xdmp:document-metadata($next-version, "system-start-time"), " 至 ", xdmp:document-metadata($next-version, "system-end-time"), "差异详情: ", xdmp:diff($curr-version, $next-version), "" )
注意事项
- 执行上述查询需要具备读取文档历史版本的权限(需管理员配置角色权限);
- 若文档为JSON格式,只需调整节点访问语法(如
$v1.title替代$v1//title/text()),核心逻辑保持一致; - 元数据中的
system-end-time为9999-12-31T23:59:59Z的版本是当前活跃版本,其余为历史归档版本。
内容的提问来源于stack exchange,提问作者Rashmita Purkayastha
相关产品推荐
相关产品推荐

