如何用XQuery在MarkLogic中筛选数组全匹配的文档编号?
在MarkLogic中使用XQuery筛选满足数组全包含条件的文档编号
需求:筛选文档的编号(no字段),要求文档的arrayList数组中所有元素都存在于查询参数的BookArray数组内。
查询参数示例(修正语法后)
{ "list": { "bookNo": 13, "BookArray": [20,21,22,23,24,25] } }
样本数据示例(修正语法后)
{ "no": "01", "arrayList": [20,25] } { "no": "02", "arrayList": [20,27] } { "no": "03", "arrayList": [20,23,25] }
解决方案XQuery代码
xquery version "1.0-ml"; (: 1. 定义或获取查询参数:如果是从HTTP请求获取,可替换为xdmp:get-request-body()解析 :) let $query-params := fn:parse-json('{ "list": { "bookNo": 13, "BookArray": [20,21,22,23,24,25] } }') let $allowed-books := $query-params?list?BookArray (: 2. 遍历目标文档,筛选符合条件的编号 :) for $doc in collection("/your-target-collection") (: 替换为实际文档集合路径 :) let $doc-no := $doc?no let $doc-array := $doc?arrayList where every $item in $doc-array satisfies $item = $allowed-books return $doc-no
代码说明
- 核心条件:
every $item in $doc-array satisfies $item = $allowed-books用于校验文档数组的所有元素都属于允许的书籍列表,这是实现"全包含"判断的关键。 - 参数获取:如果查询参数来自外部请求,可使用
xdmp:get-request-body()获取请求体后解析,替换示例中硬编码的$query-params。 - 文档选择:将
collection("/your-target-collection")替换为存储样本数据的实际集合路径,也可根据需求改用cts:search等更高效的查询方式。
预期输出
"01" "03"
内容的提问来源于stack exchange,提问作者Balan
相关产品推荐
相关产品推荐

