Xml Marklogic数据库中的节点更新
我在ML DB中保存了多个员工xml文档,文档uri为(/employee/*.xml),我想从新xml中获取更新,其中唯一引用键为roleID(在ML xml中为roleID,在新xml中为newroleID)。只要找到匹配项,它就应该用新xml的newFirstName更新ML xml的firstName值,用newlastName更新lastname值,用新dep更新dep,xml结构的其余部分应该保持不变 Marklogic XML结构如下所示:Xml Marklogic数据库中的节点更新,xml,marklogic,Xml,Marklogic,我在ML DB中保存了多个员工xml文档,文档uri为(/employee/*.xml),我想从新xml中获取更新,其中唯一引用键为roleID(在ML xml中为roleID,在新xml中为newroleID)。只要找到匹配项,它就应该用新xml的newFirstName更新ML xml的firstName值,用newlastName更新lastname值,用新dep更新dep,xml结构的其余部分应该保持不变 Marklogic XML结构如下所示: doc uri /employe
doc uri /employee/1.xml
<employee>
<firstName>Jim</firstName>
<lastName>Day</lastName>
<dep>IT</dep>
<city>Boston</city>
<roleID>1111<roleID>
<internalID>2222</internalID>
</employee>
doc uri /employee/2.xml
<employee>
<firstName>Jan</firstName>
<lastName>Silly</lastName>
<dep>Finance</dep>
<city>DC</city>
<roleID>3333<roleID>
<internalID>4444</internalID>
</employee>
doc uri /employee/3.xml
<employee>
<firstName>Jack</firstName>
<lastName>John</lastName>
<dep>HR</dep>
<city>Virginia</city>
<roleID>5555<roleID>
<internalID>6666</internalID>
</employee>
docuri/employee/1.xml
吉姆
白天
信息技术
波士顿
1111
2222
文档uri/employee/2.xml
简
愚蠢的
财务
直流
3333
4444
文档uri/employee/3.xml
杰克
约翰
人力资源
弗吉尼亚州
5555
6666
我正在尝试这个,但不知道如何更新文档,而且它似乎没有优化xquery,请帮助
let $newXML := <employees>
<newemployee>
<NewfirstName>New Fname1</newfirstName>
<newlastName>New Lname1</newlastName>
<newdep>New Dep1</newdep>
<newcity>Boston</newcity>
<newroleID>1111<newroleID>
<internalID>2222</internalID>
</newemployee>
<newemployee>
<newfirstName>New Fname2</newfirstName>
<newlastName>New Lname</newlastName>
<newdep>New Dep</newdep>
<newcity>Boston</newcity>
<newroleID>5555<newroleID>
<newinternalID>6666</newinternalID>
</employee>
</employees>
for $oldXML in doc("/employee/*.xml")/employee
where $newXML/newemployee/newroleID eq $oldXML/roleID
return
for $Matched in $oldXML
return
let $finalXML :=
(: Not sure how to update some nodes in given URI, where rest of structure remain same :)
<employee>
<firstName>{$newXML/newemployee/newfirstName/text()}</firstName>
<lastName>{$newXML/newemployee/newlastName/text()}</lastName>
<dep>{$newXML/newemployee/newdep/text()}</dep>
</employee>
let$newXML:=
新Fname1
新Lname1
新部门1
波士顿
1111
2222
新Fname2
新名称
新副署长
波士顿
5555
6666
对于文档中的$oldXML(“/employee/*.xml”)/employee
其中$newXML/newemployee/newroleID eq$oldXML/roleID
返回
对于$oldXML中匹配的$
返回
让$finalXML:=
(:不确定如何更新给定URI中的某些节点,其中结构的其余部分保持不变:)
{$newXML/newemployee/newfirstName/text()}
{$newXML/newemployee/newlastName/text()}
{$newXML/newemployee/newdep/text()}
请参见
在文档示例中:
(: insert the doc :)
xdmp:document-insert("/example.xml", <a><b>bbb</b></a>);
(: replace the b node in the doc with this c node :)
xdmp:node-replace(doc("/example.xml")/a/b, <c>ccc</c>);
doc("/example.xml") => <a><c>ccc</c></a>
(:插入文档:)
xdmp:documentinsert(“/example.xml”,bbb);
(:将单据中的b节点替换为c节点:)
xdmp:节点替换(doc(“/example.xml”)/a/b,ccc);
doc(“/example.xml”)=>ccc
请参见
在文档示例中:
(: insert the doc :)
xdmp:document-insert("/example.xml", <a><b>bbb</b></a>);
(: replace the b node in the doc with this c node :)
xdmp:node-replace(doc("/example.xml")/a/b, <c>ccc</c>);
doc("/example.xml") => <a><c>ccc</c></a>
(:插入文档:)
xdmp:documentinsert(“/example.xml”,bbb);
(:将单据中的b节点替换为c节点:)
xdmp:节点替换(doc(“/example.xml”)/a/b,ccc);
doc(“/example.xml”)=>ccc
表达式doc(“/employee/*.xml”)
不起作用。使用xdmp:directory
,前提是创建目录(自动或手动)。或者,您可以使用cts:urimatch
查找员工的uri,只要启用了uri词典,就可以将这些信息传递给doc()
但是。。方法中最大的瓶颈是遍历所有文档。这是没有必要的。如果roleID是唯一的,那么将其用于uri,这样就不需要遍历所有文档,只需立即打开正确的文档即可。或者,使用可以由XQuery处理器优化的表达式,或者只依赖于索引。如下所示:
doc()[//roleID = $newRoleID]
或:
对于更新本身,您可以使用@sgarrett建议的xdmp:node replace
和related,但也可以简单地重新创建整个XML,并使用xdmp:document insert完全替换它。无论如何,文档完全是在幕后被替换的,因此您几乎不会注意到与这些小文档的任何区别
嗯 表达式doc(“/employee/*.xml”)
不起作用。使用xdmp:directory
,前提是创建目录(自动或手动)。或者,您可以使用cts:urimatch
查找员工的uri,只要启用了uri词典,就可以将这些信息传递给doc()
但是。。方法中最大的瓶颈是遍历所有文档。这是没有必要的。如果roleID是唯一的,那么将其用于uri,这样就不需要遍历所有文档,只需立即打开正确的文档即可。或者,使用可以由XQuery处理器优化的表达式,或者只依赖于索引。如下所示:
doc()[//roleID = $newRoleID]
或:
对于更新本身,您可以使用@sgarrett建议的xdmp:node replace
和related,但也可以简单地重新创建整个XML,并使用xdmp:document insert完全替换它。无论如何,文档完全是在幕后被替换的,因此您几乎不会注意到与这些小文档的任何区别
嗯 我可以想象cts:search比使用谓词执行
doc()
更快,但我可能错了。@sgarrett很大程度上取决于优化器是否认为它可以优化。可能需要修改一下确切的语法。像xdmp:plan
这样的函数有助于实现这一点,但时间也应该足够了。如果经过优化,XPath路由的执行速度与cts:search路由相同。它们的意思完全相同。xdmp:directory(“/employee/”,$depth)
不需要手动或自动创建目录。它使用通用索引。请看,我可以想象cts:search比使用谓词执行doc()
更快,但我可能错了。@sgarrett很大程度上取决于优化器是否认为它可以优化。可能需要修改一下确切的语法。像xdmp:plan
这样的函数有助于实现这一点,但时间也应该足够了。如果经过优化,XPath路由的执行速度与cts:search路由相同。它们的意思完全相同。xdmp:directory(“/employee/”,$depth)
不需要手动或自动创建目录。它使用通用索引。看见