Xquery 如何在MarkLogic中顺序执行条件?

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 <

我有一个要求,我需要检查某些条件,并且在检查完所有条件后,我需要在数据库-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 <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>