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

Xquery 在marklogic中更新整个文档的最佳方法,xquery,marklogic,nosql,Xquery,Marklogic,Nosql,我希望在没有任何元数据(例如权限、属性或集合)的数据库中替换xml文档。托管文档(dls)不是一个选项 使用xdmp:document-insert()不会保留权限、集合等 使用xdmp:node-replace()可以很好地处理文档的某些部分,但需要事先知道根节点 在MarkLogic中是否有更新整个文档的推荐方法?您实际上不需要知道根元素本身。如果您知道文档URI,可以执行以下操作: xdmp:node-replace(fn:doc($uri)/*, $new-xml) 如果您有文档的任何

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

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

使用
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))
注意:文档属性在文档插入时保留。另见:

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

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

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