我有一个需要检查某些条件的条件,所有条件都经过检查后,我需要将文档插入到 Database-2 中,并且FLAG值为“ 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 ()
一旦我执行了所有条件,这些条件就会将我的 FLAG 节点从“ True”更改为“ False” ,如上面的代码所示。
最后,我需要检查哪个文档包含<Flag>True</Flag>
,我只需要将那些文档插入 Database-2 。
我正在从 Database-1 运行此代码。
有什么建议吗?
答案 0 :(得分:2)
在这种情况下,您还可以使用XQuery的quantified expressions:
for $i in cts:search(doc(), cts:collection-query(("MyCollection")))
where every $check in (
(...),
(...)
) satisfies $check
return xdmp:invoke-function(etc)
...
仍表示返回布尔值的表达式。您可能需要every
而不是not(some $check in (..., ...) satisfies $check)
。
答案 1 :(得分: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 $flag :=
if($condition_1) then
if($condition_2) then
if($condition_3) then
if($condition_4) then <Flag>TRUE</flag>
else <Flag>FALSE</flag>
else <Flag>FALSE</flag>
else <Flag>FALSE</flag>
else <Flag>FALSE</flag>
let $documentInsert := ...
您可能可以将from your other question放在documentInsert中。
答案 2 :(得分:0)
如果您有条件评估为布尔值,则只需评估所有这些条件的布尔结果,将其转换为字符串,然后使用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>