0

我有一个完整的逻辑,首先需要从暂存数据库和最终数据库中修改或删除文档,最后我需要将过滤后的数据插入到 DataHub 框架中的最终数据库中。

我在collector.xqy中标记了我的代码,但它说Cannot apply an update function from a query

代码如下 -

let $a := 
  for $i in cts:search(doc(),cts:collection-query(("ABC")))
  return 
    let $uri := fn:base-uri($i)
    let $a := $i/*:envelope/*:a/text()
    let $b := $i/*:envelope/*:b/text()

    let $c := if(($a eq "123") or ($b eq "345")) then base-uri($i) else ()

    let $condition := 
      for $j in $c
      let $id1 := $j/*:envelope/*:id1/text()
      let $id2 := $j/*:envelope/*:id2/text()

      let $node1 := $j/*:envelope/*:NODE1
      let $node2 := $j/*:envelope/*:NODE2
      let $result :=
        xdmp:invoke-function(
          function() { 
            cts:search(doc(),
              cts:and-query((
                cts:or-query((
                  cts:element-value-query(xs:QName("id1"),$id1),
                  cts:element-value-query(xs:QName("id2"),$id2)
                )),
                cts:collection-query(("ABC"))
              ))
            )
          },
          <options xmlns="xdmp:eval">
            <database>{xdmp:database("FINAL")}</database>
          </options>)
        return 
          if(fn:exists($result) eq fn:true()) then 
            () 
          else (
            xdmp:node-replace($node1,<NODE1>Replacing Node 1</NODE1>),
            xdmp:node-replace($node2,<NODE2>Replacing Node 2</NODE2>)
          )

    return $uri
return ()

此代码不适用于collector.xqy,因为它有更新语句。我不能在 writer.xqy 中写这个,因为初始条件即;let $c := if(($a eq "123") or ($b eq "345")) then base-uri($i) else ()我需要从 STAGING 数据库中检查。

有什么建议么 ?

4

1 回答 1

2

您可以通过针对该数据库调用来自 writer 的 STAGING 数据库来运行检查:

let $c := 
  xdmp:invoke-function(
    function() {
      if(($a eq "123") or ($b eq "345")) then base-uri($i) else ()
    },
    map:entry("database", $config:STAGING-DATABASE)
  )

假设您已经导入了配置库模块

于 2018-07-17T14:03:38.447 回答