Marklogic 如何在元素';是否使用cts:element-attribute-values()函数设置值?

Marklogic 如何在元素';是否使用cts:element-attribute-values()函数设置值?,marklogic,marklogic-8,marklogic-10,Marklogic,Marklogic 8,Marklogic 10,要求:以加入日期(/Employee/JoiningDate)的升序尽快获取与查询匹配的员工id(/Employee/@id) 环境:MarkLogic DB拥有100万员工XML QUERY-1[运行速度非常慢,但返回的数据顺序正确] let $fullQuery := cts:and-query(( cts:directory-query("/employee/", "infinity"), cts:elemen

要求:以加入日期(/Employee/JoiningDate)的升序尽快获取与查询匹配的员工id(/Employee/@id)

环境:MarkLogic DB拥有100万员工XML

QUERY-1[运行速度非常慢,但返回的数据顺序正确]

let $fullQuery :=
    cts:and-query((
        cts:directory-query("/employee/", "infinity"),
        cts:element-value-query(fn:QName("","DeptName"), "Sales", ("case-insensitive")),
        cts:element-value-query(fn:QName("","SubDeptName"), "Micro", ("case-insensitive"))
    ))
let $queryOptions := ("unfiltered", cts:index-order(cts:element-reference(fn:QName("","JoiningDate"),("type=dateTime")), "ascending"))
return cts:search(/Employee, $fullQuery, $queryOptions)!fn:string(./@id) (: Using ! to get id's in sorted order. This seems to affect performance quite heavily. :)
let $fullQuery :=
    cts:and-query((
        cts:directory-query("/employee/", "infinity"),
        cts:element-value-query(fn:QName("","DeptName"), "Sales", ("case-insensitive")),
        cts:element-value-query(fn:QName("","SubDeptName"), "Micro", ("case-insensitive"))
    ))
let $queryOptions := ("concurrent")
return cts:element-attribute-values(xs:QName("Employee"), xs:QName("id"), (), $queryOptions, $fullQuery)
QUERY-2[运行速度非常快,但返回的数据顺序不正确]

let $fullQuery :=
    cts:and-query((
        cts:directory-query("/employee/", "infinity"),
        cts:element-value-query(fn:QName("","DeptName"), "Sales", ("case-insensitive")),
        cts:element-value-query(fn:QName("","SubDeptName"), "Micro", ("case-insensitive"))
    ))
let $queryOptions := ("unfiltered", cts:index-order(cts:element-reference(fn:QName("","JoiningDate"),("type=dateTime")), "ascending"))
return cts:search(/Employee, $fullQuery, $queryOptions)!fn:string(./@id) (: Using ! to get id's in sorted order. This seems to affect performance quite heavily. :)
let $fullQuery :=
    cts:and-query((
        cts:directory-query("/employee/", "infinity"),
        cts:element-value-query(fn:QName("","DeptName"), "Sales", ("case-insensitive")),
        cts:element-value-query(fn:QName("","SubDeptName"), "Micro", ("case-insensitive"))
    ))
let $queryOptions := ("concurrent")
return cts:element-attribute-values(xs:QName("Employee"), xs:QName("id"), (), $queryOptions, $fullQuery)

如何使用上述两种方法中的任何一种来满足要求?

cts:value co-occurrents将允许您按一个索引排序,同时从另一个索引返回值

e、 g


您是否尝试过调整第一个cts:search参数的$expression的路径
cts:search(/Employee/@id,$fullQuery,$queryOptions)
@Mads-Hansen,如果它能工作,我会感到惊讶,因为从概念上讲,元素值查询与XPath/Employee/@id不匹配,因为id属性没有也不能有元素节点。无论如何,我会尝试让你知道。或者在搜索后添加该路径,而不是简单的映射operator@MadsHansen,如果你确信它会工作,你能解释一下为什么吗?使用简单映射操作符背后的原因是以预期的排序顺序获取id值。出于某种原因,我没有在cts:search表达式之后使用/@id按排序顺序获取id值。它可以工作!这里的分类是如何工作的?结果是否仅在第一个引用上排序?它是否确保数据始终按JoiningDate正确排序?结果按第一个索引引用的索引顺序返回,是。使用哪个排序规则。