xdmp:document-插入后,托管文档在 MarkLogic 10 中不起作用

Managed document not working in MarkLogic 10 after xdmp:document-insert

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

  6. 第一次管理文档

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

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

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

  8. 更新同一个文档

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

    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())```
  1. Update the same document using xdmp:document-insert

您很可能在这一步删除了 DLS Latest 集合。此外,执行此操作时不会保留版本历史记录。

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

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

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

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

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