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

Best way to update an entire document in marklogic

我想替换数据库中没有任何元数据(例如权限、属性或 collections)的 xml 文档。托管文档 (dls) 不是一个选项。

使用xdmp:document-insert()不保留权限,collections等

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

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

您真的不需要知道根元素本身。如果您知道文档 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))

注意:文档属性在文档插入时保留。另见:http://docs.marklogic.com/xdmp:document-insert

此外,这些方法之间的性能差异不大。在这方面最大的区别是 xdmp:node-replace() 需要来自原始文档的节点,这意味着必须先从数据库中检索它。如果替换不依赖于原文件,那么xdmp:document-insert()最快

HTH!

+1 给@grtjn。请注意,为什么 使用 xdmp:node-replace 并不比 xdmp:document-insert 更有效,因为所有文档更新都会更新整个文档。这是一个常见的可以理解的误解,即 xdmp:node-replace 的操作类似于 RDBMS 字段更新——只有 'touching' 受影响的字段。在 RDBMS 案例中,这通常也是一个错误的误解。

类似于不需要阅读旧文档正文,如果您知道权限、集合和质量应该是什么,您可以提供这些(或默认值)而不是使用 xdmp:document-get- 查询它们permissions() 等。它可能不会产生可衡量的差异,但与 xdmp:node-replace() 一样,如果您不需要查询一个值,那么更简单的是不要 - 并删除不需要的依赖项和错误机会(例如如果文档不存在怎么办?)