使用xdmp:document-load导入本地XML文件到MarkLogic Forest时的两类错误排查求助
咱们一个个拆解这两个问题:
第一个错误:XDMP-PLACEKEYSLOCKING
这个报错的原因很明确:当你手动指定文档要写入的特定Forest时,MarkLogic默认启用的**快速锁定(fast locking)**机制会和这个操作冲突。快速锁定是用来优化自动路由场景下的并发写入性能的,但一旦你手动指定Forest,它就没法正常工作了。
解决起来很简单,只需要在你的XML选项里添加一行关闭快速锁定的配置就行:
xdmp:document-load("C:\Users\admin-rp\Documents\myFile.xml", <options xmlns="xdmp:document-load"> <uri>/myDocs/myDocument.xml</uri> <permissions>{xdmp:default-permissions()}</permissions> <collections>{xdmp:default-collections()}</collections> <repair>full</repair> <forests> <forest>{xdmp:forest("data-hub-FINAL-1")}</forest> </forests> <fast-lock>false</fast-lock> <!-- 新增这行,关闭快速锁定 --> </options> )
第二个错误:XDMP-INVOPTVAL
这个问题出在permissions参数的格式上。XML格式的选项接受<sec:permission>元素,但map格式的选项对权限的要求完全不同——它需要的是由JSON对象或map实例组成的序列,每个对象必须包含capability(比如"read"、"update")和roleId(角色ID)或者roleName(角色名称)。
你现在的代码里,xdmp:default-permissions("objects")返回的是<sec:permission>元素序列,xdmp:permission("admin", "read", "object")也是一个元素,这些都不符合map选项的格式要求,所以才会报错。
这里给你两种修改方案:
方案1:保留默认权限并转换格式
把默认权限转换成map格式的对象,再添加你需要的admin权限:
xdmp:document-load("C:\Users\admin-rp\Documents\myFile.xml", map:map() => map:with("uri", "/documents/myFiles.xml") => map:with("permissions", ( -- 将默认权限元素转换成map对象 xdmp:default-permissions("objects") ! ( map:map() => map:with("capability", xs:string(sec:capability(.))) => map:with("roleId", xs:string(sec:role-id(.))) ), -- 添加admin角色的read权限 map:map() => map:with("capability", "read") => map:with("roleName", "admin") )) => map:with("collections", ("DDE_ASN_Booking")) => map:with("repair", "full") => map:with("forests", (xdmp:forest("data-hub-FINAL-1"))) => map:with("fast-lock", false) <!-- 同样要关闭快速锁定,因为指定了Forest --> )
方案2:直接构造所需权限(不依赖默认权限)
如果不需要默认权限,直接手动构造权限对象更简洁:
xdmp:document-load("C:\Users\admin-rp\Documents\myFile.xml", map:map() => map:with("uri", "/documents/myFiles.xml") => map:with("permissions", ( map:map() => map:with("capability", "read") => map:with("roleName", "admin"), -- 可以按需添加其他权限,比如编辑权限 map:map() => map:with("capability", "update") => map:with("roleName", "content-editor") )) => map:with("collections", ("DDE_ASN_Booking")) => map:with("repair", "full") => map:with("forests", (xdmp:forest("data-hub-FINAL-1"))) => map:with("fast-lock", false) )
最后提醒一句:只要你手动指定了Forest,不管用XML还是map选项,都必须关闭fast-lock,否则还是会触发第一个错误里的锁定冲突。
内容的提问来源于stack exchange,提问作者Rashmita Purkayastha
相关产品推荐
相关产品推荐

