我想在没有任何元数据(例如权限,属性或集合)的数据库中替换xml文档。托管文档(dls)不是一种选择。
使用xdmp:document-insert()
不会保留权限,集合等。
使用xdmp:node-replace()
可以很好地处理文档的某些部分,但需要提前知道根节点。
是否有推荐的方法在MarkLogic中更新整个文档?
答案 0 :(得分:8)
您根本不需要了解根元素本身。如果您知道文档URI,则可以执行以下操作:
xdmp:node-replace(fn:doc($uri)/*, $new-xml)
如果您有文档的任何节点,您也可以这样做:
xdmp:node-replace($node/fn:root(), $new-xml)
但是使用xdmp:document-insert()
也不是那么困难:
xdmp:document-insert($uri, $new-xml, xdmp:document-get-permissions($uri), xdmp:document-get-collections($uri), xdmp:document-get-quality($uri))
注意:document-properties保留在document-insert中。另见:http://docs.marklogic.com/xdmp:document-insert
此外,这些方法之间没有太大的性能差异。这方面的最大区别是xdmp:node-replace()
需要原始文档中的节点,这意味着必须首先从数据库中检索它。如果替换不依赖于原始文档,那么xdmp:document-insert()
将是最快的。
HTH!
答案 1 :(得分:2)
+1到@grtjn。请注意为什么使用xdmp:node-replace不比xdmp更有效:document-insert是所有文档更新都更新整个文档。一个常见的可以理解的误解是xdmp:node-replace的操作类似于RDBMS字段更新 - 只是“触摸”受影响的字段。在RDBMS案例中,这通常也是错误的误解。
类似于不需要读取旧文档正文,如果您知道权限,集合和质量应该是什么,您可以提供那些(或默认值)而不是使用xdmp查询它们:document-get-permissions()等它可能不会产生可测量的差异,但是与xdmp:node-replace()一样,如果你不需要查询一个更简单的值而不需要 - 并删除不需要的依赖项和错误机会(例如如果文档没有不存在吗?)