Marklogic 如何使用dmsdk从数据库中获取文档并将其传递给转换?

Marklogic 如何使用dmsdk从数据库中获取文档并将其传递给转换?,marklogic,transformation,marklogic-8,marklogic-9,Marklogic,Transformation,Marklogic 8,Marklogic 9,我需要从数据库中获取文档,并使用dmsdk应用转换。 我使用以下代码行成功地从数据库中获取了文档: QueryManager queryManager=client.newQueryManager(); StructuredQueryBuilder sqb = queryManager.newStructuredQueryBuilder(); StructuredQueryDefinition query =sqb.collection("test

我需要从数据库中获取文档,并使用dmsdk应用转换。 我使用以下代码行成功地从数据库中获取了文档:

        QueryManager queryManager=client.newQueryManager();
        StructuredQueryBuilder sqb = queryManager.newStructuredQueryBuilder();
        StructuredQueryDefinition query =sqb.collection("test");
它返回文档的URI。但我的转换接受json对象作为输入。 我需要传递json对象而不是uri

我的转变:

xquery version "1.0-ml";

module namespace test =
  "http://marklogic.com/rest-api/transform/deepan";

declare function test:transform(
  $context as map:map,
  $params as map:map,
  $content as document-node()
) as document-node()
{
    let $jsoncont := xdmp:from-json-string($content)

    let $inputval := "fname,lname"
    let $orig-value := map:get($jsoncont, "value")

    let $jscode := "var simple = require('/wdsUtils.sjs');
                    var content, input;
                    simple.createUri(content,input);"

    let $uri := xdmp:javascript-eval($jscode,('content',$orig-value,'input',$inputval))
    let $_ := map:put($content, "uri",$uri)
    let $_ := map:put($content, "value",$orig-value)
    return $content  

};
我的dmsdk代码:

    static String HOST = "localhost";
    static int PORT = 8136;
    static String USER = "admin";
    static String PASSWORD = "admin";
    private static DatabaseClient client = 
            DatabaseClientFactory.newClient(
                HOST, PORT, new DigestAuthContext(USER, PASSWORD));

    public static void loadData(String txName)
    {
        QueryManager queryManager=client.newQueryManager();
        StructuredQueryBuilder sqb = queryManager.newStructuredQueryBuilder();
        StructuredQueryDefinition query =sqb.collection("test");
        DataMovementManager dmm = client.newDataMovementManager();
        QueryBatcher batcher = dmm.newQueryBatcher(query);

        batcher.withConsistentSnapshot();
        ServerTransform txform = new ServerTransform(txName);

        ApplyTransformListener transformListener = new ApplyTransformListener()
                .withTransform(txform)
                .withApplyResult(ApplyResult.REPLACE);

        batcher.onUrisReady(transformListener)          
                .onQueryFailure( exception -> exception.printStackTrace() );

        dmm.startJob(batcher);
    }

    public static void main(String[] args) 
    {
        loadData("deepan");
    }
例外情况:

01:09:10.819 [main] WARN com.marklogic.client.datamovement.ApplyTransformListener - Error: com.marklogic.client.FailedRequestException: Local message: failed to apply resource at internal/apply-transform: Bad Request. Server Message: XDMP-ARGTYPE: (err:XPTY0004) fn:doc(fn:doc("/one.json")) -- arg1 is not of type xs:string* in batch with urs ([/one.json, /three.json])
01:09:10.821 [pool-1-thread-2] DEBUG com.marklogic.client.impl.OkHttpServices - Query uris with structured query <query xmlns="http://marklogic.com/appservices/search" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:search="http://marklogic.com/appservices/search" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><collection-query><uri>test</uri></collection-query></query>
01:09:10.821 [pool-1-thread-2] DEBUG com.marklogic.client.impl.OkHttpServices - Getting internal/uris as text/uri-list
01:09:10.823 [pool-1-thread-1] DEBUG com.marklogic.client.impl.OkHttpServices - Query uris with structured query <query xmlns="http://marklogic.com/appservices/search" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:search="http://marklogic.com/appservices/search" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><collection-query><uri>test</uri></collection-query></query>
01:09:10.824 [pool-1-thread-1] DEBUG com.marklogic.client.impl.OkHttpServices - Getting internal/uris as text/uri-list
01:09:10.830 [pool-1-thread-2] DEBUG com.marklogic.client.impl.OkHttpServices - Posting internal/apply-transform
01:09:10.852 [pool-1-thread-2] WARN com.marklogic.client.datamovement.ApplyTransformListener - Error: com.marklogic.client.FailedRequestException: Local message: failed to apply resource at internal/apply-transform: Bad Request. Server Message: XDMP-ARGTYPE: (err:XPTY0004) fn:doc(fn:doc("/two.json")) -- arg1 is not of type xs:string* in batch with urs ([/two.json])
01:09:10.819[main]警告com.marklogic.client.datamovement.ApplyTransformListener-错误:com.marklogic.client.FailedRequestException:本地消息:未能在内部应用资源/应用转换:错误请求。服务器消息:XDMP-ARGTYPE:(err:XPTY0004)fn:doc(fn:doc(“/one.json”))--arg1不是与urs([/one.json,/three.json]一起批处理的xs:string*类型
01:09:10.821[pool-1-thread-2]调试com.marklogic.client.impl.OkHttpServices-使用结构化查询测试查询URI
01:09:10.821[pool-1-thread-2]调试com.marklogic.client.impl.OkHttpServices-获取内部/uri作为文本/uri列表
01:09:10.823[pool-1-thread-1]调试com.marklogic.client.impl.OkHttpServices-使用结构化查询测试查询URI
01:09:10.824[pool-1-thread-1]调试com.marklogic.client.impl.OkHttpServices-获取内部/uri作为文本/uri列表
01:09:10.830[pool-1-thread-2]调试com.marklogic.client.impl.OkHttpServices-发布内部/应用转换
01:09:10.852[pool-1-thread-2]警告com.marklogic.client.datamovement.ApplyTransformListener-错误:com.marklogic.client.FailedRequestException:本地消息:未能在内部应用资源/应用转换:错误请求。服务器消息:XDMP-ARGTYPE:(err:XPTY0004)fn:doc(fn:doc(“/two.json”)--arg1不是与urs([/two.json]一起批处理的xs:string*类型
xdmp:from-json-string()需要一个字符串,但转换的$content参数是document-node(),而不是字符串

如果需要可变结构,请尝试使用xdmp:from-json()而不是xdmp:from-json-string()将json节点转换为映射

另外,我想知道xdmp:javascript-eval()是否必要。您应该能够从XQuery中调用函数,并使用

let $uri := xdmp:apply(
    xdmp:function(xs:QName("createUri"), "/wdsUtils.sjs"),
    $orig-value,
    $inputval)
return xdmp:to-json(map:entry("uri",$uri)=>map:with("value",$orig-value))
根据createUri()函数的作用,可能不需要将$content JSON节点转换为映射(在JavaScript中成为对象文字)

map:put()操作在节点上不起作用。取而代之的是,考虑将一个映射转换为一个JSON节点,并沿着

行。
let $uri := xdmp:apply(
    xdmp:function(xs:QName("createUri"), "/wdsUtils.sjs"),
    $orig-value,
    $inputval)
return xdmp:to-json(map:entry("uri",$uri)=>map:with("value",$orig-value))

希望这能有所帮助,

您的代码是否执行?你有什么错误吗?您可以发布吗?添加了异常,请检查。您的代码中似乎有多个
fn:doc
fn:doc(fn:doc(“/two.json”)
应仅为
fn:doc(“/two.json”)
,但您的代码不包含该表达式。你能在你的代码中搜索吗?不过,您的Java和转换代码看起来不错。无法在那里发现错误。将xdmp:to返回到json(map:entry(“uri”,$uri)=>map:with(“value”,$orig value))。此代码实际上用$uri替换了我的内容。我不想替换内容,我只想替换内容的uri。如果您只想更改uri,可以在上下文映射中设置它并返回原始内容。