【问题标题】:How to execute the conditions Sequentially in MarkLogic?如何在 MarkLogic 中按顺序执行条件?
【发布时间】:2018-07-16 12:16:53
【问题描述】:

我有一个要求,我需要检查某些条件,并且在检查完所有条件后 - 我需要将文档插入 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",如上面的代码所示。

最后我需要检查哪个文档有&lt;Flag&gt;True&lt;/Flag&gt; 我只需要将那些文档插入到Database-2

我正在从 Database-1 运行此代码。

有什么建议吗?

【问题讨论】:

    标签: xquery marklogic


    【解决方案1】:

    在这种情况下,您还可以使用 XQuery 的 quantified expressions

    for $i in cts:search(doc(), cts:collection-query(("MyCollection")))
    where every $check in (
        (...), 
        (...)
    ) satisfies $check
    
    return xdmp:invoke-function(etc)
    

    其中... 仍然表示返回布尔值的表达式。您可能需要not(some $check in (..., ...) satisfies $check),而不是every

    【讨论】:

      【解决方案2】:

      我通常发现最简单的方法是执行这种类型的堆叠条件检查,其中所有条件在 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 := ...
      

      你或许可以把 documentInsert 一块放在一起from your other question

      【讨论】:

        【解决方案3】:

        如果您有计算为布尔值的条件,则只需计算所有这些条件的布尔结果,将其转换为字符串,然后使用 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>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-09-04
          • 2018-09-03
          • 2021-03-03
          • 1970-01-01
          • 2021-03-16
          • 2022-01-06
          相关资源
          最近更新 更多