在 MarkLogic 中编写(创建)文档时如何在转换中添加 collections

How to add collections in transformations when writing(creating) a Document in MarkLogic

我在 xquery 中编写了一个转换,它不引用 XML-String 并插入一个元素及其内容。这很好用。 我还需要创建一个依赖于该元素的根元素的 collection。我无法在新文档上执行此操作,因为 xdmp:document-add-collections() 不起作用。如何将 collection 添加到转换中的新文档?

这是我的服务器端 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 转换创建方法。根据文档,在文档存储在数据库中之前,转换脚本是 运行。

这是一个新文档;我需要转换内容然后创建 collection.

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

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

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

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

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

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

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

根据模型的不同,最终的替代方法可能是在文档中的元素上使用范围索引来将文档收集到集合中,而不是在文档上使用集合。

希望对您有所帮助,

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

HTH!