我想根据文件内容中的一些值,使用XQuery从MarkLogic中的某个数据库中获得所有xml文件的计数。内容可以是XML结构中任何字段中的任何值。
的例子:
数据库中有5个结构相似的xml文件,其中一个xml字段<SubmissionUser>
的值在所有文件中都是不同的。
<SystemRef>22000041</SystemRef>
<DateCreated>2022-09-06T19:07:46.3492849+01:00</DateCreated>
<TimeSaved>240</TimeSaved>
<Production>true</Production>
<Partner>CGI</Partner>
<MessageType>Invoice</MessageType>
<Fail>false</Fail>
<ManyReasons/>
<SubmissionUser>Rashmita</SubmissionUser>
<InternalBusinessUnit>Finance</InternalBusinessUnit>
我想获得SubmissionUser为Rashmita且InternalBusinessUnit为Finance的5个文件中那些文件的计数。我如何在MarkLogic中使用xquery实现这一点?
您可以使用cts:element-value-query()
来搜索具有特定值的特定元素的文档,并将这两个元素的标准与cts:and-query()
结合在cts:search()
中。
如果你知道结果将相对较小,你可以count()
从cts:search()
返回多少项。但是,如果您有一个非常大的数据库,并且可能返回数百万个项目,您可能会发现count()
可能很慢。
因为这是一个相对简单的查询,不应该有假阳性和索引解析的问题。因此,使用xdmp:estimate()
而不是count()
:
xdmp:estimate(
cts:search(doc(),
cts:and-query((
cts:element-value-query(xs:QName("SubmissionUser"), "Rashmita"),
cts:element-value-query(xs:QName("InternalBusinessUnit"), "Finance")
))
)
)
您也可以使用具有相同查询条件的cts:uris()
并对uri进行计数:
count(
cts:uris("", (),
cts:and-query((
cts:element-value-query(xs:QName("SubmissionUser"), "Rashmita"),
cts:element-value-query(xs:QName("InternalBusinessUnit"), "Finance")
))
)
)