如何使用 MarkLogic xquery 判断文档是否'in-memory'



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

declare variable $doc as document-node() external;
if (fn:exists(fn:document-uri($doc))) then
  'on database'
else
  'in memory'

这似乎已经足够好了,但我在MarkLogic文档中看不到任何东西可以保证这一点。这种方法可靠吗?我应该使用其他技术吗?

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

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

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

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

如果您的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()

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

若你们能够替换、更新、删除一个节点,那个么它就在数据库中;若它抛出异常,那个么就不在数据库中。

现在有两种情况

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

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

最新更新