【问题标题】:How to add collections in transformations when writing(creating) a Document in MarkLogic在 MarkLogic 中编写(创建)文档时如何在转换中添加集合
【发布时间】:2018-07-30 08:50:16
【问题描述】:

我在 xquery 中编写了一个转换,它取消引用 XML 字符串并插入一个包含其内容的元素。这工作正常。 我还需要创建一个依赖于该元素的根元素的集合。我不能对新文档执行此操作,因为 xdmp:document-add-collections() 不起作用。如何将集合添加到转换中的新文档?

这是我的服务器端 xQuery 代码:

xquery version "1.0-ml";

module namespace transform = "http://marklogic.com/rest-api/transform/smtextdocuments";
import module namespace mem = "http://xqdev.com/in-mem-update" at '/MarkLogic/appservices/utils/in-mem-update.xqy';

declare function transform(
        $context as map:map,
        $params as map:map,
        $content as document-node()
) as document-node()
{
    let $uri := base-uri($content)
    let $doccont := $content/smtextdocuments/documentcontent
    let $newcont := xdmp:unquote($doccont)
    let $contname := node-name($newcont/*)
    let $result := if ( exists($content/smtextdocuments/content))  
    then mem:node-replace($content/smtextdocuments/content, <content>11{$newcont}</content>)
    else mem:node-insert-after($doccont, <content>{$newcont}</content>)
    let $log := xdmp:log($content)
    return (
        $result,
        xdmp:document-add-collections($uri, fn:string($contname)),
        xdmp:document-remove-collections($uri, "raw")
    )
};

该脚本使用 java api (4.0.4) 运行,通过参数 ServerTransform 转换创建方法。根据文档,转换脚本在文档存储到数据库之前运行。

这是一个新文件;我需要转换内容,然后创建集合。

我可以看到创建后的文档,内容可用。只是缺少收藏。我可以尝试 xdmp:document-insert 方法,但是在 create 运行时写入文档是否正确?

【问题讨论】:

  • 顺便说一句:我正在使用 marklogic 9

标签: transform xquery marklogic


【解决方案1】:

Java API / REST API 的转换机制负责​​文档写入。目前,transform 无法向作者提供集合。这将是一个合理的增强请求。

转换不应尝试写入文档,因为编写器也会尝试写入相同的文档。

另一种方法是在编写文档之前用 Java 转换文档,并将集合指定为写入请求的一部分。

另一种选择是将转换重写为资源服务扩展,在资源服务扩展中实现写入,并修改 Java 客户端以将文档发送到资源服务扩展。

根据模型,最后一种选择可能是使用文档中元素的范围索引来将文档收集到集合中,而不是在文档上使用集合。

希望对您有所帮助,

【讨论】:

  • 感谢您的建议。我会试试你的提示。
  • 关于增强请求:如何生成这样的请求?
  • 您可以在 GitHub 上的 Java API 上记录问题。选择 RFE 标签以将其标识为增强请求。
  • 这对你有用吗@FranzB??我有类似的要求,我需要在 REST 转换中向文档添加一个集合。
【解决方案2】:

“新文档”是什么意思?在您调整它的集合时,该文档是否已经插入到 MarkLogic 数据库中?如果没有,您可能需要针对这种情况将您的退货修改为($result, xdmp:document-insert($uri, $result, xdmp:default-permissions(), fn:string($contname)) )

否则,您能否编辑您的问题以更具体地分享您所面临的错误或问题?

【讨论】:

  • 除非你真的别无选择,否则我会避免在转换中使用 xdmp:document-insert..
【解决方案3】:

遗憾的是,REST 转换不允许这样做,就像 MLCP 转换一样。在更改之前,您拥有由 ehennum 绘制的选项,或者您可以考虑延迟将集合添加到提交前或提交后触发器。这需要一些开销,但有时在触发器中执行类似的操作非常有意义,因为它确保始终强制执行,并且是进行内容验证、审计日志记录和类似操作的好地方。

HTH!

【讨论】:

    猜你喜欢
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    相关资源
    最近更新 更多