如何在 MarkLogic 中识别唯一匹配记录

How to identify unique matching records in MarkLogic

我的 MarkLogic 暂存数据库中有一百万 XML 个这样的文档。

<Details>
  <Name>AA</Name>
  <EmpId>123</EmpId>
  <Account>
    <AccountNo>111</AccountNo>
    <IFSC>ABC</IFSC>
  </Account>
  <Account>
    <AccountNo>222</AccountNo>
    <IFSC>DEF</IFSC>
  </Account>
</Details>

在此XML中,一名员工有多个帐号。由此,我想确定任何具有相同帐号的员工。从所有1M文件中找出唯一的帐号,然后检查帐号是否与多个员工ID匹配。

如何实现?

您可以列出出现在多个员工文档中的所有 AccountNo 值的一种方法是使用 cts:value-co-occurences() method with references to an element range index of AccountNo and cts:uri-reference()(在启用 URI 词典时可用) . Return 结果作为映射,以 AccountNo 作为键,文档 URI(s) 作为值。然后过滤地图中的项目并报告哪些 AccountNo 与多个文档 URI 相关联。

let $accountNumber-to-URI := 
  cts:value-co-occurrences(
    cts:element-reference(xs:QName("AccountNo")), 
    cts:uri-reference(), 
    "map")
for $accountNumber in map:keys($accountNumber-to-URI)
where tail(map:get($accountNumber-to-URI, $accountNumber))
return $accountNumber

请注意,为了能够执行此操作,您需要在 AccountNo 元素上有一个范围索引。