【问题标题】:How to use MarkLogic xquery to tell if a document is 'in-memory'如何使用 MarkLogic xquery 来判断文档是否在“内存中”
【发布时间】:2012-08-18 02:12:20
【问题描述】:

我想知道一个 XML 文档是否已构建(例如,使用 xdmp:unquote)或已从数据库中检索。我尝试过的一种方法是检查 document-uri 属性

declare variable $doc as document-node() external;

if (fn:exists(fn:document-uri($doc))) then
  'on database'
else
  'in memory'

这似乎工作得很好,但我在 MarkLogic 文档中看不到任何保证这一点的内容。这种方法可靠吗?还有其他我应该使用的技术吗?

【问题讨论】:

    标签: xquery marklogic


    【解决方案1】:

    如果你的 XML 文档是in-memeory,你可以使用in-mem-update API

    import module namespace mem = "http://xqdev.com/in-mem-update" at "/MarkLogic/appservices/utils/in-mem-update.xqy";

    如果您的 XML 文档存在于您的数据库中,您可以使用 fn:exists()fn:doc-available()

    【讨论】:

      【解决方案2】:

      In-memory 或 In-Db 的真正测试是 xdmp:node-replace

      如果你能够替换、更新、删除一个节点,那么它在数据库中,否则如果它抛出异常,那么它不在数据库中。

      现在有两种情况

      1.您的文档根本没有创建: 您可以使用fn:empty() 来检查它是否已创建。

      2。您的文档已创建并在内存中: 如果fn:empty() 返回 false 并且 xdmp:node-replace 抛出异常,则它在内存中

      【讨论】:

        【解决方案3】:

        我认为这种行为已经稳定了一段时间。您也可以随时检查 URI,只要您希望它来自当前数据库:

        xdmp:exists(fn:doc(fn:document-uri($doc)))
        

        或者,如果您在更新上下文中并且需要 ACID 保证,请使用 fn:exists

        真正的测试是尝试调用xdmp:node-replace 或类似的方法,并捕获预期的错误。那些节点级别的更新函数不适用于构造的节点。但这需要更新上下文,并且可能很难以稳健的方式实现。

        【讨论】:

        • 检查数据库中的 URI 不是我想做的测试。一些上下文可能会更好地解释。我正在一个我无法改变的框架中工作。该框架通过对两个文档(传入文档和数据库中的现有文档)调用“getVersion”函数来进行一些简单的版本控制。我的情况很不寻常,为了获得正确的版本控制,我需要在“getVersion”函数中知道我是在处理传入文档还是现有文档。
        • 感谢您的回答。我想到了节点替换,但它有点笨拙。遗憾的是没有一些官方函数来显式检查构造的节点。
        • 嗯...版本控制机制听起来很尴尬。有没有咨询过框架作者?
        猜你喜欢
        • 2010-09-17
        • 2010-12-26
        • 2021-03-31
        • 2015-11-15
        • 1970-01-01
        • 2011-07-14
        • 1970-01-01
        • 2013-05-12
        • 1970-01-01
        相关资源
        最近更新 更多