比较MarkLogic中同一文档的两个元素

Rah*_*hul 4 xquery marklogic marklogic-8

我有一个MarkLogic 8数据库,其中有两个日期时间字段的文档:

  1. created-on
  2. active-since

我试图写一个XQuery搜索所有的文件对于其值active-since 小于价值created-on

目前我正在使用以下FLWOR表达:

    for $entity in fn:collection("entities")

    let $id := fn:data($entity//id)
    let $created-on := fn:data($entity//created-on)
    let $active-since := fn:data($entity//active-since)

    where $active-since < $created-on

    return 
      (
        $id,
        $created-on,
        $active-since
      )
Run Code Online (Sandbox Code Playgroud)

上述查询执行时间过长,并且随着文档数量的增加,此查询的执行时间也将增加.

此外,我有 element-range-index两个上面提到的dateTime字段,但它们没有在这里使用.所述CTS-元件查询函数只有一个元素与一组原子值进行比较.在我的情况下,我试图比较同一文件的两个元素.

我认为应该有一个更好和优化的解决方案来解决这个问题.

如果有任何搜索功能或任何其他适合此方案的方法,请通知我.

Dav*_*nis 5

这对您来说可能足够有效.

获取其中一个值并按值构建范围查询.这都使用范围索引,因此从这个意义上讲,它是有效的.但是,在某些时候,我们构建了一个大型查询.它读起来与flword语句类似.如果真的想要提高效率,可以找出哪些元素的唯一值(索引大小)较少,并将其用于迭代 - 从而构建较小的查询.此外,您将注意到在元素值调用中,我还将其约束到您的集合.这是为了防止您碰巧在集合之外的文档中包含该元素.这使列表仅保留您知道的集合中的值:

let $q := cts:or-query(
        for $created-on in cts:element-values(xs:QName("created-on"), (), cts:collection-query("entities"))
            return cts:element-value-range-query(xs:Qname("active-since"), "<" $created-on)
    )


return
    cts:search(
        fn:collection("entities"),
        $q
    )
Run Code Online (Sandbox Code Playgroud)

所以,让我们解释一下在一个简单的例子中发生了什么:
让我说我有元素A和B - 每个元素都定义了一个范围索引.

让我们假装我们在5个文件中有这样的组合:
A,B
2,3
4,2
2,7
5,4
2,9

let $ := cts:or-query(
        for $a in cts:element-values(xs:QName("A"))
            return cts:element-value-range-query(xs:Qname("B"), "<" $a)
    )
Run Code Online (Sandbox Code Playgroud)

这将创建以下查询:

cts:or-query(
    (
       cts:element-value-range-query(xs:Qname("B"), "<" 2),
       cts:element-value-range-query(xs:Qname("B"), "<" 4),
       cts:element-value-range-query(xs:Qname("B"), "<" 5)
    )
 )
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,唯一的匹配是具有组合的文档:(5,4)