Xquery 如何在MarkLogic中顺序执行条件?
我有一个要求,我需要检查某些条件,并且在检查完所有条件后,我需要在数据库-2中插入文件,标记值为“True” 代码如下-Xquery 如何在MarkLogic中顺序执行条件?,xquery,marklogic,Xquery,Marklogic,我有一个要求,我需要检查某些条件,并且在检查完所有条件后,我需要在数据库-2中插入文件,标记值为“True” 代码如下- for $i in cts:search(doc(),cts:collection-query(("MyCollection"))) return let $condition_1 := if{...} then <Flag>FALSE</Flag> else () let $condition_2 := if{...} then <
for $i in cts:search(doc(),cts:collection-query(("MyCollection")))
return
let $condition_1 := if{...} then <Flag>FALSE</Flag> else ()
let $condition_2 := if{...} then <Flag>FALSE</Flag> else ()
let $condition_3 := if{...} then <Flag>FALSE</Flag> else ()
let $condition_4 := if{...} then <Flag>FALSE</Flag> else ()
在cts:search(doc(),cts:collection查询((“MyCollection”))中搜索$i
返回
让$condition_1:=如果{…}那么FALSE-else()
让$condition_2:=如果{…},那么FALSE-else()
让$condition_3:=如果{…},那么FALSE-else()
让$condition_4:=如果{…}那么FALSE-else()
一旦我将执行所有条件,这些条件将把我的标志节点从的“True”更改为“False”,如上述代码所示
最后,我需要检查哪个文档具有True
,我只需要将这些文档插入数据库-2
我正在从数据库-1运行此代码
有什么建议吗?我通常发现,使用映射技术,在XQuery中所有条件都必须为真的情况下,执行这种类型的堆叠条件检查是最容易的:
let $conditionMap = map:map();
let $_ := map:put($conditionMap, "check", fn:false())
let $condition_1 := if{...} then () else map:put($conditionMap, "check", fn:true())
let $condition_2 := if{...} then () else map:put($conditionMap, "check", fn:true())
let $condition_3 := if{...} then () else map:put($conditionMap, "check", fn:true())
let $condition_4 := if{...} then () else map:put($conditionMap, "check", fn:true())
let $flag := <Flag>{if(map:get($conditionMap, "check") eq fn:false()) then "FALSE" else "TRUE"}</Flag>
let $documentInsert := ...
let$conditionMap=map:map();
let$\ux:=map:put($conditionMap,“check”,fn:false())
让$condition_1:=if{…}then()else映射:put($conditionMap,“check”,fn:true())
让$condition_2:=if{…}then()else映射:put($conditionMap,“check”,fn:true())
让$condition_3:=if{…}then()else映射:put($conditionMap,“check”,fn:true())
让$condition_4:=if{…}then()else映射:put($conditionMap,“check”,fn:true())
让$flag:={如果(map:get($conditionMap,“check”)eq fn:false(),则为“false”,否则为“TRUE”}
让$documentInsert:=。。。
另一种技术(我发现效率更高,但可读性较差)是:
let$flag:=
如果($condition_1),则
如果($condition_2),则
如果($condition_3),则
如果($condition_4),则为真
否则错误
否则错误
否则错误
否则错误
让$documentInsert:=。。。
您可能可以将documentInsert片段放在一起。您也可以在以下情况下使用XQuery:
for $i in cts:search(doc(), cts:collection-query(("MyCollection")))
where every $check in (
(...),
(...)
) satisfies $check
return xdmp:invoke-function(etc)
其中,
…
仍然表示返回布尔值的表达式。您可能希望而不是每一个,不满足(…,…)满足$check)
如果您有计算为布尔值的条件,则只需计算所有这些条件的布尔值,将其转换为字符串,然后使用fn:upper-case()
获取其大写值:
for $i in cts:search(doc(), cts:collection-query(("MyCollection")))
let $condition_1 := {...}
let $condition_2 := {...}
let $condition_3 := {...}
let $condition_4 := {...}
return
<Flag>{
fn:upper-case(fn:string( ($condition_1 and $condition_2 and $condition_3 and $condition_4))
}</Flag>
在cts:search(doc(),cts:collection查询((“MyCollection”))中搜索$i
让$condition_1:={…}
让$condition_2:={…}
让$condition_3:={…}
让$condition_4:={…}
返回
{
fn:大写(fn:字符串($condition_1和$condition_2和$condition_3和$condition_4))
}
for $i in cts:search(doc(), cts:collection-query(("MyCollection")))
let $condition_1 := {...}
let $condition_2 := {...}
let $condition_3 := {...}
let $condition_4 := {...}
return
<Flag>{
fn:upper-case(fn:string( ($condition_1 and $condition_2 and $condition_3 and $condition_4))
}</Flag>