STAGING DB にいくつかのドキュメントがあります。
条件に基づいて、同じ ID のドキュメントが FINAL に存在するかどうかを確認する必要があります。
その場合は、ドキュメントの複数のノードを STAGING から FINAL に置き換えてから挿入する必要があります。
DOC from STAGING-
<root>
<ID>1</ID>
<value1>India</value1>
<value2>USA</value2>
<value3>Russia</value3>
<value4>Srilanka</value4>
<value5>Europe</value5>
<value6>Antartica</value6>
<value7>Spain</value7>
</root>
DOC from FINAL-
<root>
<ID>1</ID>
<value1></value1>
<value2></value2>
<value3></value3>
<value4></value4>
<value5>Europe</value5>
<value6>Antartica</value6>
</root>
OUTPUT私はFINALで期待しています-
<root>
<ID>1</ID>
<value1>India</value1>
<value2>USA</value2>
<value3>Russia</value3>
<value4>Srilanka</value4>
<value5>Europe</value5>
<value6>Antartica</value6>
<value7>Spain</value7>
</root>
STAGING から (value1,value2,value,value4,value7) に焦点を合わせて置き換えるだけです。他の値については、いくつかの異なる条件があるため、それらを無視する必要があります。
WRITER.xqyに書いたロジック-
let $boolean := fn:false()
let $var := if((......)
then
(
let $docs :=
cts:search(doc(),cts:and-query((
cts:element-value-query(xs:QName("ID"),$id),
cts:collection-query(("MyCollection"))
)))
let $temp :=
if((fn:exists($result) eq fn:true())) then xdmp:set($boolean,fn:true()) else ()
return $docs
)
else ()
let $envelope := if($boolean)
then
(
let $nodes := ("value1,value2,value,value4,value7")
let $tokenize := fn:tokenize($nodes,",")
let $values := for $i in $tokenize
let $final := xdmp:value(fn:concat("$var//*:root/*:",$i))
let $staging := xdmp:value(fn:concat("<",$i,">","{$envelope//*:root/*:",$i,"/text()}","</",$i,">"))
let $envelope := mem:node-replace($final,$staging)
return $envelope
return $values
)
else $envelope
return
xdmp:document-insert($id,$envelope, xdmp:default-permissions(), map:get($options, "entity"))
これは私に与えます
エラー - xdmp:document-insert の ARG2 は NODE ではありません。
私は$envelope
すべてのノードを繰り返し、複数のエンベロープを返すので、それを理解しています。
これを解決するための提案はありますか?