创建status路径范围索引,获取指定文档并生成currentreservationnumber元素
嘿,我来一步步帮你搞定这三个XML文档操作,假设你用的是MarkLogic(毕竟路径范围索引是它的核心特性之一,要是用其他XML数据库,思路也差不多,只是具体命令会有区别):
1. 为
Status元素创建路径范围索引 要让后续查询更高效,先给Status元素建个路径范围索引,有两种方式:
- 通过管理员界面操作:
- 登录数据库的Admin控制台,进入你的目标数据库配置页
- 找到「Path Range Indexes」标签页,点击「Add」按钮
- 在「Path Expression」里填写
/root/Status(注意要和XML里的元素路径完全匹配,你的示例里是大写的Status) - 「Scalar Type」选择
string就行,因为Status的值是字符串类型(比如del、act) - 保存配置后,按需重启数据库让索引生效
- 用XQuery命令创建:
直接执行这段代码就能创建索引:xdmp:database-path-range-index-create( xdmp:database(), "/root/Status", "string", () )
2. 获取所有
Status值为del的文档 有了索引之后,查询效率会高很多,用XQuery写两种查询方式:
- 基础查询(适合小数据集):
for $doc in fn:collection() where $doc/root/Status = "del" return $doc - 利用索引的优化查询(大数据集首选):
for $doc in cts:search( fn:collection(), cts:path-range-query("/root/Status", "=", "del") ) return $doc
后者会直接调用刚创建的路径索引,查询速度快不少。
3. 为符合条件的文档添加
currentreservationnumber元素 接下来要给这些Status为del的文档,在RevisionNumber元素后(如果需要作为子元素,可修改命令)加新元素,值是RevisionNumber的数值加1:
xquery version "1.0-ml"; for $doc in cts:search( fn:collection(), cts:path-range-query("/root/Status", "=", "del") ) let $rev-number := xs:integer($doc/root/RevisionNumber/text()) return -- 若要把新元素作为RevisionNumber的子元素,将xdmp:node-insert-after改为xdmp:node-insert-child即可 xdmp:node-insert-after( $doc/root/RevisionNumber, <currentreservationnumber>{$rev-number + 1}</currentreservationnumber> )
这段代码逻辑很清晰:先定位目标文档,把RevisionNumber的文本转成整数再加1,最后插入新元素。
⚠️ 提示:执行更新操作前记得确认权限,最好先在测试环境跑一遍,避免误改生产数据哦!
内容的提问来源于stack exchange,提问作者Gotham Knight
相关产品推荐
相关产品推荐

