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