在marklogic中更新整个文档的最佳方法

时间:2016-01-30 10:29:20

标签: xquery marklogic nosql

我想在没有任何元数据(例如权限,属性或集合)的数据库中替换xml文档。托管文档(dls)不是一种选择。

使用xdmp:document-insert()不会保留权限,集合等。

使用xdmp:node-replace()可以很好地处理文档的某些部分,但需要提前知道根节点。

是否有推荐的方法在MarkLogic中更新整个文档?

2 个答案:

答案 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()一样,如果你不需要查询一个更简单的值而不需要 - 并删除不需要的依赖项和错误机会(例如如果文档没有不存在吗?)