如何使用Marklogic XQuery获取需要的数据cts:search
How to get the data required using Marklogic XQuery cts:search
所以,我最近在 Marklogic 上接受了一家知名公司的面试。他问了我一个我无法回答的问题。有一个 XML 示例数据,如下所示。
他问我你怎么能只得到 员工 ID 其 zipcode
是 12345
和 state
是 california
使用搜索?喜欢 cts:search
我想到的是像下面这样写 XPath 但是因为他问我使用搜索我无法回答
let $x :=//employee/officeAddress[zipCode="38023"]/../employeeId/string()
return $x
xml 数据集:
<employees>
<employee>
<employeeId>30004</employeeId>
<firstName>crazy</firstName>
<lastName>carol</lastName>
<designation>Director</designation>
<homeAddress>
<address>900 clean ln</address>
<street>quarky st</street>
<city>San Jose</city>
<state>California</state>
<zipCode>22222</zipCode>
</homeAddress>
<officeAddress>
<address>000 washington ave</address>
<street>bonaza st</street>
<city>San Francisco</city>
<state>California</state>
<zipCode>12345</zipCode>
</officeAddress>
<employee>
</employees>
对于许多熟悉 XML 技术并开始使用 MarkLogic 的人来说,使用 XPath 是一个自然而然的初始想法。这是我刚开始的时候最开始做的事情。
一些 XPath 表达式可以被数据库优化并快速有效地执行,但也有一些不能并且可能执行得不好。
使用 cts:search
和内置查询结构可以优化表达式,利用索引,并允许您通过分析 xdmp:plan
、xdmp:query-meters
和 xdmp:query-trace
.
第二个 $query
参数中的等效 cts:search
expression for the XPath, specifying the path to /employees/employee
in the first $path
parameter and combining cts:element-value-query
with cts:and-query
为:
cts:search(/employees/employee,
cts:and-query((
cts:element-value-query(xs:QName("zipCode"), "12345"),
cts:element-value-query(xs:QName("state"), "California") )))/employeeId
您还可以使用更通用的 $path
来搜索所有文档,并使用 xdmp:element-query()
包围 cts:element-value-query
条件以将搜索限制为 employee
元素,然后将 XPath 放入生成的文档中:
cts:search(doc(),
cts:element-query(xs:QName("employee"),
cts:and-query((
cts:element-value-query(xs:QName("zipCode"), "12345"),
cts:element-value-query(xs:QName("state"), "California") ))
)
)/employees/employee/employeeId
xpath 我会尝试(未测试):
/employees/employee[officeAddress/zipCode = '38023' 和 officeAddress/state = 'California']/employeeId/string()
请注意,您也可以在 xpath 上使用 xdmp:plan;看看它与 cts:search.
的工作原理很有趣
一般来说,相对于 xpath(我喜欢 xpath!),你最好尽可能多地投入 cts:search。
这个问题有点模棱两可。一份文件中有很多员工吗?还是很多员工文件?两个?
此外,不要忘记添加适当的位置索引,否则您将无法获得很多未经过滤的帮助。查看添加索引前后的计划
另见 https://help.marklogic.com/Knowledgebase/Article/View/queries-constrained-to-elements
所以,我最近在 Marklogic 上接受了一家知名公司的面试。他问了我一个我无法回答的问题。有一个 XML 示例数据,如下所示。
他问我你怎么能只得到 员工 ID 其 zipcode
是 12345
和 state
是 california
使用搜索?喜欢 cts:search
我想到的是像下面这样写 XPath 但是因为他问我使用搜索我无法回答
let $x :=//employee/officeAddress[zipCode="38023"]/../employeeId/string()
return $x
xml 数据集:
<employees>
<employee>
<employeeId>30004</employeeId>
<firstName>crazy</firstName>
<lastName>carol</lastName>
<designation>Director</designation>
<homeAddress>
<address>900 clean ln</address>
<street>quarky st</street>
<city>San Jose</city>
<state>California</state>
<zipCode>22222</zipCode>
</homeAddress>
<officeAddress>
<address>000 washington ave</address>
<street>bonaza st</street>
<city>San Francisco</city>
<state>California</state>
<zipCode>12345</zipCode>
</officeAddress>
<employee>
</employees>
对于许多熟悉 XML 技术并开始使用 MarkLogic 的人来说,使用 XPath 是一个自然而然的初始想法。这是我刚开始的时候最开始做的事情。
一些 XPath 表达式可以被数据库优化并快速有效地执行,但也有一些不能并且可能执行得不好。
使用 cts:search
和内置查询结构可以优化表达式,利用索引,并允许您通过分析 xdmp:plan
、xdmp:query-meters
和 xdmp:query-trace
.
第二个 $query
参数中的等效 cts:search
expression for the XPath, specifying the path to /employees/employee
in the first $path
parameter and combining cts:element-value-query
with cts:and-query
为:
cts:search(/employees/employee,
cts:and-query((
cts:element-value-query(xs:QName("zipCode"), "12345"),
cts:element-value-query(xs:QName("state"), "California") )))/employeeId
您还可以使用更通用的 $path
来搜索所有文档,并使用 xdmp:element-query()
包围 cts:element-value-query
条件以将搜索限制为 employee
元素,然后将 XPath 放入生成的文档中:
cts:search(doc(),
cts:element-query(xs:QName("employee"),
cts:and-query((
cts:element-value-query(xs:QName("zipCode"), "12345"),
cts:element-value-query(xs:QName("state"), "California") ))
)
)/employees/employee/employeeId
xpath 我会尝试(未测试):
/employees/employee[officeAddress/zipCode = '38023' 和 officeAddress/state = 'California']/employeeId/string()
请注意,您也可以在 xpath 上使用 xdmp:plan;看看它与 cts:search.
的工作原理很有趣一般来说,相对于 xpath(我喜欢 xpath!),你最好尽可能多地投入 cts:search。
这个问题有点模棱两可。一份文件中有很多员工吗?还是很多员工文件?两个?
此外,不要忘记添加适当的位置索引,否则您将无法获得很多未经过滤的帮助。查看添加索引前后的计划
另见 https://help.marklogic.com/Knowledgebase/Article/View/queries-constrained-to-elements