1

我正在将数据从一个拓扑复制到另一个拓扑(例如拓扑 1 的数据在 DB1 中,拓扑 2 的数据在 DB 2 中)并且我想在单个查询中对两个数据库执行检查以检查所有文件是否通过检查它们的 Uris 或 Hash 值是否相同。那可能吗?

4

1 回答 1

3

仅当您预先计算散列并将其存储在文档或其属性中时,使用散列的检查才能很好地执行。但是基于 uris 的检查非常简单。以下解决方案不会无休止地扩展,但应该可以很好地工作到几百万个 uri。只需将其复制粘贴到 QConsole 中,然后针对您选择的数据库运行它,然后将$other-db-name值更改为要比较的数据库名称:

xquery version "1.0-ml";

let $other-db-name := "OtherDocuments"
return
xdmp:eval(
  '
    xquery version "1.0-ml";

    declare variable $uris as map:map external;

    "In other, but not here:",
    map:keys(cts:uris((), "map") - $uris),

    "Here, but not in other:",
    map:keys($uris - cts:uris((), "map"))
  ',
  (
    xs:QName("uris"), cts:uris((), "map")
  ),
  <options xmlns="xdmp:eval">
    <database>{xdmp:database($other-db-name)}</database>
  </options>
)

于 2016-01-14T13:14:32.373 回答