如何使用MarkLogic xquery来判断文档是否为“内存中”

时间:2012-08-22 15:43:37

标签: xquery marklogic

我想知道是否已构建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文档中看到任何可以保证这一点的内容。这种方法可靠吗?我应该使用其他一些技术吗?

3 个答案:

答案 0 :(得分:2)

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

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

或者,如果您处于更新环境中并需要ACID保证,请使用fn:exists

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

答案 1 :(得分: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 :(得分:0)

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

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

现在有两种情况

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

<强> 2。您的文档已创建并且已记录在内存中    如果fn:empty()返回false并且xdmp:node-replace抛出异常那么它在内存中