Marklogic 在不更改版本的情况下更新托管文档

Marklogic 在不更改版本的情况下更新托管文档,marklogic,Marklogic,我使用了图书馆服务API将文档插入MarkLogic。在某些情况下,我需要只保存未签入的更改。这意味着将更改保存到当前版本本身,而不增加版本号。在一些CMIS规范中已经看到了这种功能,它为签入相同版本的文档提供了现成的解决方案。在MarkLogic中找不到任何类似的API。我可以想到的另一种选择是取消对托管文档的管理,使用xdmp函数执行内容更新和重新存储。但这会使以前的版本松动。有没有其他的替代方法 您是否尝试过简单地使用xdmp更新函数,从而绕过DLS?例如,您可以使用xdmp:node r

我使用了图书馆服务API将文档插入
MarkLogic
。在某些情况下,我需要只保存未签入的更改。这意味着将更改保存到当前版本本身,而不增加版本号。在一些CMIS规范中已经看到了这种功能,它为签入相同版本的文档提供了现成的解决方案。在
MarkLogic
中找不到任何类似的API。我可以想到的另一种选择是取消对托管文档的管理,使用xdmp函数执行内容更新和重新存储。但这会使以前的版本松动。有没有其他的替代方法

您是否尝试过简单地使用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>
(:新的托管文档:)
导入模块命名空间dls=”http://marklogic.com/xdmp/dls" 
位于“/MarkLogic/dls.xqy”;
dls:文档插入和管理('test',true(),)
=> ()
导入模块命名空间dls=”http://marklogic.com/xdmp/dls" 
位于“/MarkLogic/dls.xqy”;
dls:管理文档(“测试”),
dls:文档历史记录(“测试”)
=>
真的
1.
测试
真的
2013-03-15T10:22:35.642645-07:00
9712740001723797867
假的
看起来不错。让我们尝试一个非托管更新

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>
xdmp:node replace(doc('test')/test,)
=> ()
文件(‘测试’)
=> 
导入模块命名空间dls=”http://marklogic.com/xdmp/dls" 
位于“/MarkLogic/dls.xqy”;
dls:管理文档(“测试”),
dls:文档历史记录(“测试”)
=>
真的
1.
测试
真的
2013-03-15T10:22:35.642645-07:00
9712740001723797867
假的
因此,更新工作正常,但文档历史记录仍显示版本1。这就是你想要的,对吗


现在,我作为管理员用户做了这件事。对于非管理员用户,您可能需要授予一些额外的权限,或者创建amp可能会更干净。这可以用来防止意外的非托管更新。

您是否尝试过简单地使用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>
(:新的托管文档:)
导入模块命名空间dls=”http://marklogic.com/xdmp/dls" 
位于“/MarkLogic/dls.xqy”;
dls:文档插入和管理('test',true(),)
=> ()
导入模块命名空间dls=”http://marklogic.com/xdmp/dls" 
位于“/MarkLogic/dls.xqy”;
dls:管理文档(“测试”),
dls:文档历史记录(“测试”)
=>
真的
1.
测试
真的
2013-03-15T10:22:35.642645-07:00
9712740001723797867
假的
看起来不错。让我们尝试一个非托管更新

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>
xdmp:node replace(doc('test')/test,)
=> ()
文件(‘测试’)
=> 
导入模块命名空间dls=”http://marklogic.com/xdmp/dls" 
位于“/MarkLogic/dls.xqy”;
dls:管理文档(“测试”),
dls:文档历史记录(“测试”)
=>
真的
1.
测试
真的
2013-03-15T10:22:35.642645-07:00
9712740001723797867
假的
因此,更新工作正常,但文档历史记录仍显示版本1。这就是你想要的,对吗


现在,我作为管理员用户做了这件事。对于非管理员用户,您可能需要授予一些额外的权限,或者创建amp可能会更干净。这可以用来防止意外的非托管更新。

我确信这里有一些技巧可以在不丢失您的版本的情况下实现这一点。我确信这里有一些技巧可以在不丢失您的版本的情况下实现这一点。我已经尝试过了,但没有效果。我不确定我是否使用过管理员角色或拥有足够的权限。这正是我想要的。将通过分配适当的权限来尝试。非常感谢:)我试过这个,但不起作用。我不确定我是否使用过管理员角色或拥有足够的权限。这正是我想要的。将通过分配适当的权限来尝试。非常感谢:)