【问题标题】:Best way to update an entire document in marklogic在 marklogic 中更新整个文档的最佳方法
【发布时间】:2016-05-08 03:20:26
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: xquery marklogic nosql


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您实际上并不需要知道根元素本身。如果您知道文档 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!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-25
        • 1970-01-01
        • 1970-01-01
        • 2020-07-21
        • 2014-10-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多