Marklogic 有没有一种方法可以搜索一个路径范围索引等于另一个路径范围索引的文档?

Marklogic 有没有一种方法可以搜索一个路径范围索引等于另一个路径范围索引的文档?,marklogic,Marklogic,我想获取所有文档,其中一个路径范围索引值等于同一文档中的另一个值 (示例:/metadata/book title=/metadata/chapter title)。有办法吗?是-将([参考路径范围索引])的结果传递给另一个的 let $title-list := cts:values(cts:path-reference("/metadata/book-title")) let $match-query := cts:range-query( cts:path-reference("/me

我想获取所有文档,其中一个路径范围索引值等于同一文档中的另一个值
(示例:/metadata/book title=/metadata/chapter title)。有办法吗?

是-将([参考路径范围索引])的结果传递给另一个的

let $title-list := cts:values(cts:path-reference("/metadata/book-title"))
let $match-query := cts:range-query(
  cts:path-reference("/metadata/chapter-title"),
  "=",
  $title-list
)
然后在较大的查询中使用$match查询

请注意,这是一个简单的示例。实际上,您可能会使用查询选项和可能的查询范围调整完整查询和cts:values()的结果


还请注意,还有一个cts:path-range-query()而不是更方便的范围查询。但是,我尝试保持代码的通用性(不关心索引中的数据来自何处,因为实现细节可能会随时间而改变)。

显而易见的想法是将一个字段上的
cts:values
结果输入另一个字段上的所谓散弹枪或查询,但这并不能确保文档中的两个字段相等。之后必须使用XPath手动过滤误报,这不是很理想

更好的方法是使用。类似这样的内容可以让您了解这将如何工作:

import module namespace op="http://marklogic.com/optic"
     at "/MarkLogic/optic.xqy";

op:from-lexicons(
  map:new((
    map:entry("bookTitle", cts:element-reference(xs:QName("book-title"))),
    map:entry("chapterTitle", cts:element-reference(xs:QName("chapter-title"))),
    map:entry("uri", cts:uri-reference())
  )),
  "books"
)
 => op:where(
      op:eq(
        op:view-col("books", "bookTitle"),
        op:view-col("books", "chapterTitle")
      )
    )
 => op:result() 
如果与索引匹配,则可以使用其他引用(如路径引用)替换元素引用