在 xdmp:文档插入之后的 MarkLogic 10 中无法工作的托管文档


  1. 第一次使用dls:document-insert-and-manage管理文档
  2. 使用xdmp:document-insert更新同一文档
  3. 文档从dls最新版本集合cts:search(/scopedIntervention/id , dls:documents-query())丢失

  4. 首次管理文档

    <scopedIntervention>
    <id>someId12345</id>
    <scopedInterventionName>
    First Name
    </scopedInterventionName>
    <forTestOnly>
    true
    </forTestOnly>
    <inactive>
    true
    </inactive>
    </scopedIntervention>)```
    **Document inserted with versioning**
    
  5. 验证文档是否存在于最新文档集合中

    cts:search(/scopedIntervention/id , dls:documents-query())

    托管最新集合中存在的文档

  6. 更新同一文档

    <scopedIntervention>
    <id>someId12345</id>
    <scopedInterventionName>
    Updated Name
    </scopedInterventionName>
    <forTestOnly>
    true
    </forTestOnly>
    <inactive>
    true
    </inactive>
    </scopedIntervention>)```
    **Update document to same URI using xdmp:document-insert**
    
  7. 再次验证文档是否存在于最新文档集合中

    cts:search(/scopedIntervention/id , dls:documents-query())

    文档不存在于托管的最新集合中(从集合中丢失)

使用以下升级步骤应用 DLS 包后,同一文档显示在列表中''xquery 版本"1.0-ml"; 导入模块命名空间 DLS ="http://marklogic.com/xdmp/dls" at "/MarkLogic/dls.xqy";

dls:set-upgrade-status(fn:false()),
dls:start-upgrade(),
fn:doc("http://marklogic.com/dls/upgrade-task-status.xml"),
dls:latest-validation-results(),
dls:set-upgrade-status(fn:true())```
  1. 使用 xdmp:document-insert 更新同一文档

您很可能在此步骤中删除 DLS 最新集合。此外,执行此操作时不会保留版本历史记录。

而不是使用 xdmp:文档插入,你应该使用 dls:文档-签出-更新-签入。

请阅读到最后 - 如果您没有在升级的 ML 版本上进行 DLS 升级 - 立即停止并按照升级说明进行操作。 不这样做会使 DLS 处于不稳定状态,您所做的任何其他事情都会使修复变得更加困难。

+1 Rob. @IAM,在 V7 中,dls 无法确定它是否"有效"或似乎"有效",因此 dls 不是为处理您所描述的情况而设计的。DLS 体系结构依赖于在签入/签出语义中封装对文档的所有更改。 绕过它,您不妨完全绕过DLS,因为它不起作用。它在 V7 中"工作"的事实用词不当,它可能没有以您的应用程序关心的方式不正确地表现,或者您的代码可能巧合地完成了与内部结构足够相似的工作。 你可能会很幸运,找到一种方法来再次这样做,但我鼓励你考虑如何在库的定义行为中工作,或者重构那些不是"DLS 友好"的代码部分,以便在签出/签入窗口之间操作 - 并非所有更新都必须是签出 - 更新 - 签入 - 你可以签出 - 做任何事情 - 然后签入。

作为迁移解决方法,您可以持续使用添加到 dls 的升级功能。 请参阅 https://docs.marklogic.com/dls:start-upgrade
在 V9(我相信)中,对需要运行此代码的 DLS 内部进行了重大的非向后兼容更改。一下假设是从以前的 DLS 到当前 DLS 的就地更新。但是,代码也可能碰巧持续工作,具体取决于 DLS 代码不知道的应用程序代码正在执行的操作的详细信息。 "新"DLS 代码添加了一个内部集合,以优化搜索"最新"文档的常见情况 - 如果删除该集合,那么这些文档将不会显示在 DLS 搜索中(对于"最新")。

你提到你的代码是"迁移脚本"-->如果这些是从 V7 迁移到 V10,那么你可以在 V10 更新之前运行你的代码,然后运行 V10 更新,然后运行 dls-upgrade。 之后,文档应该处于良好状态 - 只要您不执行任何其他未为托管文档定义的行为。

最新更新