MarkLogic:查找含无child1的parent元素的XML文档
解决方案:高效查找含无child1的parent元素的文档
核心需求是匹配至少存在一个不含
1. XQuery cts查询实现
使用cts:element-query嵌套cts:not-query,定位存在"不含child1的parent"的文档:
let $query := cts:element-query( xs:QName('parent'), cts:not-query( cts:element-query(xs:QName('child1'), cts:true-query()) ) ) return cts:search(fn:doc(), $query)
- 逻辑说明:匹配包含
元素的文档,且该 元素内部不存在 。只要文档中有一个这样的parent,就会被命中,完全符合需求。
2. 搜索模块(search:search)实现
将上述查询集成到搜索模块的options中,支持更灵活的结果处理:
xquery version "1.0-ml"; import module namespace search = "http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy"; let $options := <options xmlns="http://marklogic.com/appservices/search"> <extract-document-data selected="include"> <extract-path xmlns:es="http://marklogic.com/entity-services">//root</extract-path> </extract-document-data> <additional-query> <cts:element-query xmlns:cts="http://marklogic.com/cts"> <cts:element>parent</cts:element> <cts:not-query> <cts:element-query> <cts:element>child1</cts:element> <cts:true-query/> </cts:element-query> </cts:not-query> </cts:element-query> </additional-query> </options> return search:search("", $options)
3. REST API调用实现
通过MarkLogic REST端点/v1/search提交查询,请求体如下(可根据需要调整提取规则):
{ "options": { "extract-document-data": { "selected": "include", "extract-path": "//root" }, "additional-query": { "element-query": { "element": "parent", "not-query": { "element-query": { "element": "child1", "true-query": {} } } } } } }
性能说明
以上方案均基于MarkLogic的cts索引实现,不会进行全文档遍历,适合数十亿级别的大型数据库场景,避免了普通XPath查询的性能瓶颈。
内容的提问来源于stack exchange,提问作者DarthDell
相关产品推荐
相关产品推荐

