更新托管文档而不更改版本

时间:2013-03-15 13:04:30

标签: marklogic

我使用图书馆服务API 将文档插入MarkLogic。在某些情况下,我需要在不签入的情况下保存更改。这意味着将更改保存到当前版本本身而不增加版本号。已经在一些 CMIS 规范中看到过这样的设施,它提供了用于检查具有相同版本的文档的现成解决方案。在MarkLogic中找不到任何类似的 API 。我能想到的备用选项是取消管理托管文档,使用 xdmp 函数来执行更新并重新管理内容。但这会松开以前的版本。还有其他替代方法吗?

1 个答案:

答案 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.这就是你想要的,对吧?

现在,我以管理员用户身份执行此操作。对于非管理员用户,您可能必须授予一些额外的权限 - 或者创建一个放大器可能更干净。这可以用来防止意外的非托管更新。