我使用图书馆服务API 将文档插入MarkLogic
。在某些情况下,我需要在不签入的情况下保存更改。这意味着将更改保存到当前版本本身而不增加版本号。已经在一些 CMIS 规范中看到过这样的设施,它提供了用于检查具有相同版本的文档的现成解决方案。在MarkLogic
中找不到任何类似的 API 。我能想到的备用选项是取消管理托管文档,使用 xdmp 函数来执行更新并重新管理内容。但这会松开以前的版本。还有其他替代方法吗?
答案 0 :(得分:1)
您是否尝试过简单地使用xdmp更新功能,从而绕过DLS?例如,您可以使用xdmp:node-replace
替换文档的根元素。文档说你“必须”使用DLS函数进行更新,但我认为这意味着DLS不会管理非DLS更新。
我们试试。
(: new managed document :)
import module namespace dls = "http://marklogic.com/xdmp/dls"
at "/MarkLogic/dls.xqy";
dls:document-insert-and-manage('test', true(), <test id="1"/>)
=> ()
import module namespace dls = "http://marklogic.com/xdmp/dls"
at "/MarkLogic/dls.xqy";
dls:document-is-managed('test'),
dls:document-history('test')
=>
true
<dls:document-history uri="test" xmlns:dls="http://marklogic.com/xdmp/dls">
<dls:version>
<dls:version-id>1</dls:version-id>
<dls:document-uri>test</dls:document-uri>
<dls:latest>true</dls:latest>
<dls:created>2013-03-15T10:22:35.642645-07:00</dls:created>
<dls:author>9712740001723797867</dls:author>
<dls:annotation/>
<dls:deleted>false</dls:deleted>
</dls:version>
</dls:document-history>
看起来不错。让我们尝试一种非托管更新。
xdmp:node-replace(doc('test')/test, <test id="2"/>)
=> ()
doc('test')
=> <test id="2"/>
import module namespace dls = "http://marklogic.com/xdmp/dls"
at "/MarkLogic/dls.xqy";
dls:document-is-managed('test'),
dls:document-history('test')
=>
true
<dls:document-history uri="test" xmlns:dls="http://marklogic.com/xdmp/dls">
<dls:version>
<dls:version-id>1</dls:version-id>
<dls:document-uri>test</dls:document-uri>
<dls:latest>true</dls:latest>
<dls:created>2013-03-15T10:22:35.642645-07:00</dls:created>
<dls:author>9712740001723797867</dls:author>
<dls:annotation/>
<dls:deleted>false</dls:deleted>
</dls:version>
</dls:document-history>
所以更新有效,但文档历史记录仍然显示版本1.这就是你想要的,对吧?
现在,我以管理员用户身份执行此操作。对于非管理员用户,您可能必须授予一些额外的权限 - 或者创建一个放大器可能更干净。这可以用来防止意外的非托管更新。