我想获取所有路径范围索引值等于同一文档中另一个值的所有文档 (例如:/ metadata / book-title = / metadata / chapter-title)。有办法吗?
答案 0 :(得分:5)
一个显而易见的想法是将一个字段上的cts:values
结果馈送到另一个字段上的所谓的Shotgun-OR查询中,但是这不能确保文档中两个字段都相等。之后,您必须手动使用XPath过滤误报,这不是很理想。
更好的方法是使用Optic API。这样的事情可以让您了解如何工作:
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()
如果与您的索引匹配,则可以用其他引用(例如路径引用)替换element-references。
HTH!
答案 1 :(得分:2)
是-您将cts:values([参考到您的path-range-index])的结果传递给另一个cts:range-query。
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-query。
请注意,这只是一个简单的例子。实际上,您可能会使用查询选项以及查询范围cts:values()的结果来调整完整查询和cts:values()。
还请注意,还有一个cts:path-range-query()而不是range-query,它可能更方便。但是,我尝试使我的代码保持通用性(不关心索引中数据的来源,因为实现细节可能会随时间变化)。