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

时间:2018-07-16 12:16:54

标签: xquery marklogic

我有一个需要检查某些条件的条件,所有条件都经过检查后,我需要将文档插入到 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 运行此代码。

有什么建议吗?

3 个答案:

答案 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>