You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对比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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 07:45:35