【问题标题】:Managed document not working in MarkLogic 10 after xdmp:document-insert在 xdmp:document-insert 之后,托管文档在 MarkLogic 10 中不起作用
【发布时间】:2019-11-28 10:44:17
【问题描述】:
  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" 在“/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())```

【问题讨论】:

    标签: database-migration marklogic database-restore marklogic-7 marklogic-10


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:
      1. 使用 xdmp:document-insert 更新同一文档

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

      您应该使用 dls:document-checkout-update-checkin 而不是 xdmp:document-insert。

      【讨论】:

      • 在 MarkLogic 7 xdmp:document-insert 中保留集合中的托管文档。我有一堆迁移脚本和 xqy 库,我计划迁移到 MarkLogic 10。那么,除了用 dls:document-checkout-update-checkin 替换 dmp:document-insert 之外,还有其他选择吗?不需要对现有 xqy 库进行更改的替代选项。
      • 你可以试试 xdmp:document-insert($uri, $document, xdmp:document-get-permissions($uri), xdmp:document-get-collections($uri)) 。但是,当您这样做时,您不会保留版本历史记录。那么你为什么还要为 DLS 烦恼呢?
      • 我所说的自定义应用程序库已经在运行。因此,从xdmp:document-insert 更改为dls:document-checkout-update-checkin 需要彻底测试应用程序的每个角落案例。将检查此新更改需要多少更改。
      • @IAM 如果您与 MarkLogic 员工一起工作或有能力联系熟悉您的项目的人,我强烈推荐它。听起来您可能只能完全摆脱 DLS,或者可能无法正确使用 xdmp:document-get-collections 进行收集。如果没有大量测试,我绝对不会轻易改变生产。
      • Rob S,感谢您的回复,现在我正面临托管版本特定文档的新问题。这是新线程stackoverflow.com/questions/57206843/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      相关资源
      最近更新 更多